Break down a large folder into multiple subfolders by sequential names
I have a folder with 20000 files in it. I need to split it into subfolders with increasing directory name (dir_1, dir_2....) with each folder having 500 files each in such a way that for example if files are from file_1.png to file_20000, the first folder should contain first 500 files i.e., file_1 to file 500 and immediate folder should contain files in a continued manner i.e, file_501 to file_1000 and so on. I have tried many scripts on internet but none helped me. Can anyone please help me in making this possible..
shell-script
New contributor
add a comment |
I have a folder with 20000 files in it. I need to split it into subfolders with increasing directory name (dir_1, dir_2....) with each folder having 500 files each in such a way that for example if files are from file_1.png to file_20000, the first folder should contain first 500 files i.e., file_1 to file 500 and immediate folder should contain files in a continued manner i.e, file_501 to file_1000 and so on. I have tried many scripts on internet but none helped me. Can anyone please help me in making this possible..
shell-script
New contributor
1
I'd love to see a more informative title to this question!
– Jeff Schaller
29 mins ago
2
please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
– DopeGhoti
14 mins ago
add a comment |
I have a folder with 20000 files in it. I need to split it into subfolders with increasing directory name (dir_1, dir_2....) with each folder having 500 files each in such a way that for example if files are from file_1.png to file_20000, the first folder should contain first 500 files i.e., file_1 to file 500 and immediate folder should contain files in a continued manner i.e, file_501 to file_1000 and so on. I have tried many scripts on internet but none helped me. Can anyone please help me in making this possible..
shell-script
New contributor
I have a folder with 20000 files in it. I need to split it into subfolders with increasing directory name (dir_1, dir_2....) with each folder having 500 files each in such a way that for example if files are from file_1.png to file_20000, the first folder should contain first 500 files i.e., file_1 to file 500 and immediate folder should contain files in a continued manner i.e, file_501 to file_1000 and so on. I have tried many scripts on internet but none helped me. Can anyone please help me in making this possible..
shell-script
shell-script
New contributor
New contributor
edited 23 mins ago
Praveen Kumar
New contributor
asked 31 mins ago
Praveen KumarPraveen Kumar
12
12
New contributor
New contributor
1
I'd love to see a more informative title to this question!
– Jeff Schaller
29 mins ago
2
please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
– DopeGhoti
14 mins ago
add a comment |
1
I'd love to see a more informative title to this question!
– Jeff Schaller
29 mins ago
2
please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
– DopeGhoti
14 mins ago
1
1
I'd love to see a more informative title to this question!
– Jeff Schaller
29 mins ago
I'd love to see a more informative title to this question!
– Jeff Schaller
29 mins ago
2
2
please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
– DopeGhoti
14 mins ago
please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
– DopeGhoti
14 mins ago
add a comment |
3 Answers
3
active
oldest
votes
#!/bin/sh
files_per_dir=500
set -- file_*
printf 'There are %d filesn' "$#"
printf 'Putting %d files in each new directoryn' "$files_per_dir"
N=0 # directory counter
n=0 # file counter
for filename do
if [ "$(( n % files_per_dir ))" -eq 0 ]; then
N=$(( N + 1 ))
dir="dir_$N"
printf 'Creating directory %sn' "$dir"
# mkdir "$dir"
fi
n=$(( n + 1 ))
printf 'Moving %s to %sn' "$filename" "$dir"
# mv -i -- "$filename" "$dir"
done
The above would put 500 files into each directory (the actual command that changes things have been commented out for safety). The filenames are assumed to match file_*
and each new directory will be called dir_N
where N
is a positive integer.
If you want to move the files based on their numerical names (the above sorts the files in lexicographical order), then use
printf 'Moving %s to %dn' "file_$n" "$dir"
# mv -i -- "file_$n" "$dir"
instead (i.e. replace the corresponding two lines in the first script with these, in this order).
add a comment |
cd lotsafiles
for i in {1..20000}; do
dirnum="$(((i/500)+1))"
mkdir "dir_${dirnum}"
mv "file${i}.png" "dir_${dirnum}"/
done
add a comment |
Something simple along the lines of:
#!/bin/bash
typeset -i i
typeset -i j
typeset -i k
i=0
j=0
k=0
mkdir dir_$j
for file in * ; do
i=$i+1
k=$k+1
if [ $i = 500 ] ; then
j=$j+1
i=0
mkdir dir_$j
fi
mv "$file" dir_$j/file_$k
done
Not tested, so you might put an echo
in front of the mv "$file" dir_$j
to see if it does what you want. Anyway it will give you an idea of how to do what you want.
Yes it works. That's why thetypeset -i
is there. Yes, I use string comparison, but that also works. Would you prefer I put#!/bin/sh
as first line?
– Ljm Dullaart
6 mins ago
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
});
}
});
Praveen Kumar is a new contributor. Be nice, and check out our Code of Conduct.
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%2f493049%2fbreak-down-a-large-folder-into-multiple-subfolders-by-sequential-names%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
#!/bin/sh
files_per_dir=500
set -- file_*
printf 'There are %d filesn' "$#"
printf 'Putting %d files in each new directoryn' "$files_per_dir"
N=0 # directory counter
n=0 # file counter
for filename do
if [ "$(( n % files_per_dir ))" -eq 0 ]; then
N=$(( N + 1 ))
dir="dir_$N"
printf 'Creating directory %sn' "$dir"
# mkdir "$dir"
fi
n=$(( n + 1 ))
printf 'Moving %s to %sn' "$filename" "$dir"
# mv -i -- "$filename" "$dir"
done
The above would put 500 files into each directory (the actual command that changes things have been commented out for safety). The filenames are assumed to match file_*
and each new directory will be called dir_N
where N
is a positive integer.
If you want to move the files based on their numerical names (the above sorts the files in lexicographical order), then use
printf 'Moving %s to %dn' "file_$n" "$dir"
# mv -i -- "file_$n" "$dir"
instead (i.e. replace the corresponding two lines in the first script with these, in this order).
add a comment |
#!/bin/sh
files_per_dir=500
set -- file_*
printf 'There are %d filesn' "$#"
printf 'Putting %d files in each new directoryn' "$files_per_dir"
N=0 # directory counter
n=0 # file counter
for filename do
if [ "$(( n % files_per_dir ))" -eq 0 ]; then
N=$(( N + 1 ))
dir="dir_$N"
printf 'Creating directory %sn' "$dir"
# mkdir "$dir"
fi
n=$(( n + 1 ))
printf 'Moving %s to %sn' "$filename" "$dir"
# mv -i -- "$filename" "$dir"
done
The above would put 500 files into each directory (the actual command that changes things have been commented out for safety). The filenames are assumed to match file_*
and each new directory will be called dir_N
where N
is a positive integer.
If you want to move the files based on their numerical names (the above sorts the files in lexicographical order), then use
printf 'Moving %s to %dn' "file_$n" "$dir"
# mv -i -- "file_$n" "$dir"
instead (i.e. replace the corresponding two lines in the first script with these, in this order).
add a comment |
#!/bin/sh
files_per_dir=500
set -- file_*
printf 'There are %d filesn' "$#"
printf 'Putting %d files in each new directoryn' "$files_per_dir"
N=0 # directory counter
n=0 # file counter
for filename do
if [ "$(( n % files_per_dir ))" -eq 0 ]; then
N=$(( N + 1 ))
dir="dir_$N"
printf 'Creating directory %sn' "$dir"
# mkdir "$dir"
fi
n=$(( n + 1 ))
printf 'Moving %s to %sn' "$filename" "$dir"
# mv -i -- "$filename" "$dir"
done
The above would put 500 files into each directory (the actual command that changes things have been commented out for safety). The filenames are assumed to match file_*
and each new directory will be called dir_N
where N
is a positive integer.
If you want to move the files based on their numerical names (the above sorts the files in lexicographical order), then use
printf 'Moving %s to %dn' "file_$n" "$dir"
# mv -i -- "file_$n" "$dir"
instead (i.e. replace the corresponding two lines in the first script with these, in this order).
#!/bin/sh
files_per_dir=500
set -- file_*
printf 'There are %d filesn' "$#"
printf 'Putting %d files in each new directoryn' "$files_per_dir"
N=0 # directory counter
n=0 # file counter
for filename do
if [ "$(( n % files_per_dir ))" -eq 0 ]; then
N=$(( N + 1 ))
dir="dir_$N"
printf 'Creating directory %sn' "$dir"
# mkdir "$dir"
fi
n=$(( n + 1 ))
printf 'Moving %s to %sn' "$filename" "$dir"
# mv -i -- "$filename" "$dir"
done
The above would put 500 files into each directory (the actual command that changes things have been commented out for safety). The filenames are assumed to match file_*
and each new directory will be called dir_N
where N
is a positive integer.
If you want to move the files based on their numerical names (the above sorts the files in lexicographical order), then use
printf 'Moving %s to %dn' "file_$n" "$dir"
# mv -i -- "file_$n" "$dir"
instead (i.e. replace the corresponding two lines in the first script with these, in this order).
answered 10 mins ago
KusalanandaKusalananda
122k16230375
122k16230375
add a comment |
add a comment |
cd lotsafiles
for i in {1..20000}; do
dirnum="$(((i/500)+1))"
mkdir "dir_${dirnum}"
mv "file${i}.png" "dir_${dirnum}"/
done
add a comment |
cd lotsafiles
for i in {1..20000}; do
dirnum="$(((i/500)+1))"
mkdir "dir_${dirnum}"
mv "file${i}.png" "dir_${dirnum}"/
done
add a comment |
cd lotsafiles
for i in {1..20000}; do
dirnum="$(((i/500)+1))"
mkdir "dir_${dirnum}"
mv "file${i}.png" "dir_${dirnum}"/
done
cd lotsafiles
for i in {1..20000}; do
dirnum="$(((i/500)+1))"
mkdir "dir_${dirnum}"
mv "file${i}.png" "dir_${dirnum}"/
done
edited 6 mins ago
Kusalananda
122k16230375
122k16230375
answered 14 mins ago
DopeGhotiDopeGhoti
43.5k55382
43.5k55382
add a comment |
add a comment |
Something simple along the lines of:
#!/bin/bash
typeset -i i
typeset -i j
typeset -i k
i=0
j=0
k=0
mkdir dir_$j
for file in * ; do
i=$i+1
k=$k+1
if [ $i = 500 ] ; then
j=$j+1
i=0
mkdir dir_$j
fi
mv "$file" dir_$j/file_$k
done
Not tested, so you might put an echo
in front of the mv "$file" dir_$j
to see if it does what you want. Anyway it will give you an idea of how to do what you want.
Yes it works. That's why thetypeset -i
is there. Yes, I use string comparison, but that also works. Would you prefer I put#!/bin/sh
as first line?
– Ljm Dullaart
6 mins ago
add a comment |
Something simple along the lines of:
#!/bin/bash
typeset -i i
typeset -i j
typeset -i k
i=0
j=0
k=0
mkdir dir_$j
for file in * ; do
i=$i+1
k=$k+1
if [ $i = 500 ] ; then
j=$j+1
i=0
mkdir dir_$j
fi
mv "$file" dir_$j/file_$k
done
Not tested, so you might put an echo
in front of the mv "$file" dir_$j
to see if it does what you want. Anyway it will give you an idea of how to do what you want.
Yes it works. That's why thetypeset -i
is there. Yes, I use string comparison, but that also works. Would you prefer I put#!/bin/sh
as first line?
– Ljm Dullaart
6 mins ago
add a comment |
Something simple along the lines of:
#!/bin/bash
typeset -i i
typeset -i j
typeset -i k
i=0
j=0
k=0
mkdir dir_$j
for file in * ; do
i=$i+1
k=$k+1
if [ $i = 500 ] ; then
j=$j+1
i=0
mkdir dir_$j
fi
mv "$file" dir_$j/file_$k
done
Not tested, so you might put an echo
in front of the mv "$file" dir_$j
to see if it does what you want. Anyway it will give you an idea of how to do what you want.
Something simple along the lines of:
#!/bin/bash
typeset -i i
typeset -i j
typeset -i k
i=0
j=0
k=0
mkdir dir_$j
for file in * ; do
i=$i+1
k=$k+1
if [ $i = 500 ] ; then
j=$j+1
i=0
mkdir dir_$j
fi
mv "$file" dir_$j/file_$k
done
Not tested, so you might put an echo
in front of the mv "$file" dir_$j
to see if it does what you want. Anyway it will give you an idea of how to do what you want.
answered 13 mins ago
Ljm DullaartLjm Dullaart
58817
58817
Yes it works. That's why thetypeset -i
is there. Yes, I use string comparison, but that also works. Would you prefer I put#!/bin/sh
as first line?
– Ljm Dullaart
6 mins ago
add a comment |
Yes it works. That's why thetypeset -i
is there. Yes, I use string comparison, but that also works. Would you prefer I put#!/bin/sh
as first line?
– Ljm Dullaart
6 mins ago
Yes it works. That's why the
typeset -i
is there. Yes, I use string comparison, but that also works. Would you prefer I put #!/bin/sh
as first line?– Ljm Dullaart
6 mins ago
Yes it works. That's why the
typeset -i
is there. Yes, I use string comparison, but that also works. Would you prefer I put #!/bin/sh
as first line?– Ljm Dullaart
6 mins ago
add a comment |
Praveen Kumar is a new contributor. Be nice, and check out our Code of Conduct.
Praveen Kumar is a new contributor. Be nice, and check out our Code of Conduct.
Praveen Kumar is a new contributor. Be nice, and check out our Code of Conduct.
Praveen Kumar is a new contributor. Be nice, and check out our Code of Conduct.
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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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%2f493049%2fbreak-down-a-large-folder-into-multiple-subfolders-by-sequential-names%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
1
I'd love to see a more informative title to this question!
– Jeff Schaller
29 mins ago
2
please please do not post images of text. Or, if you must, at least don't post such sparse images, and make them more helpful in the context of the question.
– DopeGhoti
14 mins ago