move files based on content
Clash Royale CLAN TAG#URR8PPP
I want to move all files that contain a number greater than 25 (at least on one instance) but don't contain any number smaller than 25 after the string >randomnumber_xxx_ to a specific folder.
Example of a file that needs to be moved:
>23424_xxx_26
>331134_xxx_27
>6634_xxx_30
Example of a file that doesn't need to be moved:
>22234_xxx_20
>434534_xxx_27
text-processing files
add a comment |
I want to move all files that contain a number greater than 25 (at least on one instance) but don't contain any number smaller than 25 after the string >randomnumber_xxx_ to a specific folder.
Example of a file that needs to be moved:
>23424_xxx_26
>331134_xxx_27
>6634_xxx_30
Example of a file that doesn't need to be moved:
>22234_xxx_20
>434534_xxx_27
text-processing files
add a comment |
I want to move all files that contain a number greater than 25 (at least on one instance) but don't contain any number smaller than 25 after the string >randomnumber_xxx_ to a specific folder.
Example of a file that needs to be moved:
>23424_xxx_26
>331134_xxx_27
>6634_xxx_30
Example of a file that doesn't need to be moved:
>22234_xxx_20
>434534_xxx_27
text-processing files
I want to move all files that contain a number greater than 25 (at least on one instance) but don't contain any number smaller than 25 after the string >randomnumber_xxx_ to a specific folder.
Example of a file that needs to be moved:
>23424_xxx_26
>331134_xxx_27
>6634_xxx_30
Example of a file that doesn't need to be moved:
>22234_xxx_20
>434534_xxx_27
text-processing files
text-processing files
asked Feb 20 at 6:11
holahola
31
31
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
So, the first issue is to detect the files that needs to be moved.
This could be done using grep
:
grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$'
These commands would return true if the input data contained a line that matched the given extended regular expressions.
The expression _(1?[0-9]|2[0-4])$
would match any positive integer less than 25 occurring at the end of a line after an underscore, and _(2[5-9]|[3-9][0-9]|[0-9]3,)$
matches any positive integer greater than or equal to 25 at the end of the line after an underscore (assuming there are no zero-filled integers such as 002
). We also match the >
at the start of the line. The -q
option would stop grep
from actually outputting anything (we're only interested in whether we could find one of these lines or not).
For a file to be copied, the first grep
must return false and the second grep
must return true.
Applying this to each file of a directory (in this case regardless of what the files are called as you did not say anything about this):
for filename in ./*; do
[ ! -f "$filename" ] && continue
if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$' "$filename"
then
mv -i "$filename" /some/destination
fi
done
This would move the files that fulfil the requirements to some destination directory at /some/destination
. The -i
option to mv
would cause the utility to ask for confirmation before overwriting an already existing file with the same name as the file being moved.
The first [ ! -f ... ]
test in the loop would skip anything in the directory that is not a regular file (or a symbolic link to a regular file).
echo 001 | grep -Ee "[0-9]3,"
it will match 001, which is less than 25.
– Prvt_Yadv
Feb 20 at 8:03
@PRY With the added assumption about integers that are not zero-filled, I think this should be ok.
– Kusalananda
Feb 20 at 8:10
Worked great. Thanks!
– hola
Feb 20 at 16:39
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f501772%2fmove-files-based-on-content%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
So, the first issue is to detect the files that needs to be moved.
This could be done using grep
:
grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$'
These commands would return true if the input data contained a line that matched the given extended regular expressions.
The expression _(1?[0-9]|2[0-4])$
would match any positive integer less than 25 occurring at the end of a line after an underscore, and _(2[5-9]|[3-9][0-9]|[0-9]3,)$
matches any positive integer greater than or equal to 25 at the end of the line after an underscore (assuming there are no zero-filled integers such as 002
). We also match the >
at the start of the line. The -q
option would stop grep
from actually outputting anything (we're only interested in whether we could find one of these lines or not).
For a file to be copied, the first grep
must return false and the second grep
must return true.
Applying this to each file of a directory (in this case regardless of what the files are called as you did not say anything about this):
for filename in ./*; do
[ ! -f "$filename" ] && continue
if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$' "$filename"
then
mv -i "$filename" /some/destination
fi
done
This would move the files that fulfil the requirements to some destination directory at /some/destination
. The -i
option to mv
would cause the utility to ask for confirmation before overwriting an already existing file with the same name as the file being moved.
The first [ ! -f ... ]
test in the loop would skip anything in the directory that is not a regular file (or a symbolic link to a regular file).
echo 001 | grep -Ee "[0-9]3,"
it will match 001, which is less than 25.
– Prvt_Yadv
Feb 20 at 8:03
@PRY With the added assumption about integers that are not zero-filled, I think this should be ok.
– Kusalananda
Feb 20 at 8:10
Worked great. Thanks!
– hola
Feb 20 at 16:39
add a comment |
So, the first issue is to detect the files that needs to be moved.
This could be done using grep
:
grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$'
These commands would return true if the input data contained a line that matched the given extended regular expressions.
The expression _(1?[0-9]|2[0-4])$
would match any positive integer less than 25 occurring at the end of a line after an underscore, and _(2[5-9]|[3-9][0-9]|[0-9]3,)$
matches any positive integer greater than or equal to 25 at the end of the line after an underscore (assuming there are no zero-filled integers such as 002
). We also match the >
at the start of the line. The -q
option would stop grep
from actually outputting anything (we're only interested in whether we could find one of these lines or not).
For a file to be copied, the first grep
must return false and the second grep
must return true.
Applying this to each file of a directory (in this case regardless of what the files are called as you did not say anything about this):
for filename in ./*; do
[ ! -f "$filename" ] && continue
if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$' "$filename"
then
mv -i "$filename" /some/destination
fi
done
This would move the files that fulfil the requirements to some destination directory at /some/destination
. The -i
option to mv
would cause the utility to ask for confirmation before overwriting an already existing file with the same name as the file being moved.
The first [ ! -f ... ]
test in the loop would skip anything in the directory that is not a regular file (or a symbolic link to a regular file).
echo 001 | grep -Ee "[0-9]3,"
it will match 001, which is less than 25.
– Prvt_Yadv
Feb 20 at 8:03
@PRY With the added assumption about integers that are not zero-filled, I think this should be ok.
– Kusalananda
Feb 20 at 8:10
Worked great. Thanks!
– hola
Feb 20 at 16:39
add a comment |
So, the first issue is to detect the files that needs to be moved.
This could be done using grep
:
grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$'
These commands would return true if the input data contained a line that matched the given extended regular expressions.
The expression _(1?[0-9]|2[0-4])$
would match any positive integer less than 25 occurring at the end of a line after an underscore, and _(2[5-9]|[3-9][0-9]|[0-9]3,)$
matches any positive integer greater than or equal to 25 at the end of the line after an underscore (assuming there are no zero-filled integers such as 002
). We also match the >
at the start of the line. The -q
option would stop grep
from actually outputting anything (we're only interested in whether we could find one of these lines or not).
For a file to be copied, the first grep
must return false and the second grep
must return true.
Applying this to each file of a directory (in this case regardless of what the files are called as you did not say anything about this):
for filename in ./*; do
[ ! -f "$filename" ] && continue
if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$' "$filename"
then
mv -i "$filename" /some/destination
fi
done
This would move the files that fulfil the requirements to some destination directory at /some/destination
. The -i
option to mv
would cause the utility to ask for confirmation before overwriting an already existing file with the same name as the file being moved.
The first [ ! -f ... ]
test in the loop would skip anything in the directory that is not a regular file (or a symbolic link to a regular file).
So, the first issue is to detect the files that needs to be moved.
This could be done using grep
:
grep -q -E '^>.*_(1?[0-9]|2[0-4])$'
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$'
These commands would return true if the input data contained a line that matched the given extended regular expressions.
The expression _(1?[0-9]|2[0-4])$
would match any positive integer less than 25 occurring at the end of a line after an underscore, and _(2[5-9]|[3-9][0-9]|[0-9]3,)$
matches any positive integer greater than or equal to 25 at the end of the line after an underscore (assuming there are no zero-filled integers such as 002
). We also match the >
at the start of the line. The -q
option would stop grep
from actually outputting anything (we're only interested in whether we could find one of these lines or not).
For a file to be copied, the first grep
must return false and the second grep
must return true.
Applying this to each file of a directory (in this case regardless of what the files are called as you did not say anything about this):
for filename in ./*; do
[ ! -f "$filename" ] && continue
if ! grep -q -E '^>.*_(1?[0-9]|2[0-4])$' "$filename" &&
grep -q -E '^>.*_(2[5-9]|[3-9][0-9]|[0-9]3,)$' "$filename"
then
mv -i "$filename" /some/destination
fi
done
This would move the files that fulfil the requirements to some destination directory at /some/destination
. The -i
option to mv
would cause the utility to ask for confirmation before overwriting an already existing file with the same name as the file being moved.
The first [ ! -f ... ]
test in the loop would skip anything in the directory that is not a regular file (or a symbolic link to a regular file).
edited Feb 20 at 8:10
answered Feb 20 at 7:54
KusalanandaKusalananda
135k17256424
135k17256424
echo 001 | grep -Ee "[0-9]3,"
it will match 001, which is less than 25.
– Prvt_Yadv
Feb 20 at 8:03
@PRY With the added assumption about integers that are not zero-filled, I think this should be ok.
– Kusalananda
Feb 20 at 8:10
Worked great. Thanks!
– hola
Feb 20 at 16:39
add a comment |
echo 001 | grep -Ee "[0-9]3,"
it will match 001, which is less than 25.
– Prvt_Yadv
Feb 20 at 8:03
@PRY With the added assumption about integers that are not zero-filled, I think this should be ok.
– Kusalananda
Feb 20 at 8:10
Worked great. Thanks!
– hola
Feb 20 at 16:39
echo 001 | grep -Ee "[0-9]3,"
it will match 001, which is less than 25.– Prvt_Yadv
Feb 20 at 8:03
echo 001 | grep -Ee "[0-9]3,"
it will match 001, which is less than 25.– Prvt_Yadv
Feb 20 at 8:03
@PRY With the added assumption about integers that are not zero-filled, I think this should be ok.
– Kusalananda
Feb 20 at 8:10
@PRY With the added assumption about integers that are not zero-filled, I think this should be ok.
– Kusalananda
Feb 20 at 8:10
Worked great. Thanks!
– hola
Feb 20 at 16:39
Worked great. Thanks!
– hola
Feb 20 at 16:39
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f501772%2fmove-files-based-on-content%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown