Bash script to move through folders, unzip, and move files up one directory
I have a group of folders that all have zip files in them that may contain 1 or 2 files in them each in a new folder. (see diagram below)
I want to point the script at the top level directory and have it to go through each sub directory, extract the contents of the zip, move the contents of that sub directory up one level (deleting the original zipped file optional).
--before--
Photos
-2018
--jan.zip
[--jan1 ]--
[---jan1.pdf]---}-contents of Zipped file
[---jan1.JPG]--/
--feb.zip
[--feb1 ]--
[---feb1.pdf]---}-contents of Zipped file
[---feb1.JPG]--/
...
--after--
Photos
-2018
--jan1.pdf
--jan1.JPG
--feb1.pdf
--feb1.JPG
bash shell-script mv zip
New contributor
add a comment |
I have a group of folders that all have zip files in them that may contain 1 or 2 files in them each in a new folder. (see diagram below)
I want to point the script at the top level directory and have it to go through each sub directory, extract the contents of the zip, move the contents of that sub directory up one level (deleting the original zipped file optional).
--before--
Photos
-2018
--jan.zip
[--jan1 ]--
[---jan1.pdf]---}-contents of Zipped file
[---jan1.JPG]--/
--feb.zip
[--feb1 ]--
[---feb1.pdf]---}-contents of Zipped file
[---feb1.JPG]--/
...
--after--
Photos
-2018
--jan1.pdf
--jan1.JPG
--feb1.pdf
--feb1.JPG
bash shell-script mv zip
New contributor
3
What have your tried?
– Peschke
9 hours ago
I may attempt a solution in python but I don’t do bash scripting.
– Tommiie
7 hours ago
add a comment |
I have a group of folders that all have zip files in them that may contain 1 or 2 files in them each in a new folder. (see diagram below)
I want to point the script at the top level directory and have it to go through each sub directory, extract the contents of the zip, move the contents of that sub directory up one level (deleting the original zipped file optional).
--before--
Photos
-2018
--jan.zip
[--jan1 ]--
[---jan1.pdf]---}-contents of Zipped file
[---jan1.JPG]--/
--feb.zip
[--feb1 ]--
[---feb1.pdf]---}-contents of Zipped file
[---feb1.JPG]--/
...
--after--
Photos
-2018
--jan1.pdf
--jan1.JPG
--feb1.pdf
--feb1.JPG
bash shell-script mv zip
New contributor
I have a group of folders that all have zip files in them that may contain 1 or 2 files in them each in a new folder. (see diagram below)
I want to point the script at the top level directory and have it to go through each sub directory, extract the contents of the zip, move the contents of that sub directory up one level (deleting the original zipped file optional).
--before--
Photos
-2018
--jan.zip
[--jan1 ]--
[---jan1.pdf]---}-contents of Zipped file
[---jan1.JPG]--/
--feb.zip
[--feb1 ]--
[---feb1.pdf]---}-contents of Zipped file
[---feb1.JPG]--/
...
--after--
Photos
-2018
--jan1.pdf
--jan1.JPG
--feb1.pdf
--feb1.JPG
bash shell-script mv zip
bash shell-script mv zip
New contributor
New contributor
edited 8 hours ago
Jeff Schaller
39.4k1054125
39.4k1054125
New contributor
asked 9 hours ago
JaymesRSJaymesRS
11
11
New contributor
New contributor
3
What have your tried?
– Peschke
9 hours ago
I may attempt a solution in python but I don’t do bash scripting.
– Tommiie
7 hours ago
add a comment |
3
What have your tried?
– Peschke
9 hours ago
I may attempt a solution in python but I don’t do bash scripting.
– Tommiie
7 hours ago
3
3
What have your tried?
– Peschke
9 hours ago
What have your tried?
– Peschke
9 hours ago
I may attempt a solution in python but I don’t do bash scripting.
– Tommiie
7 hours ago
I may attempt a solution in python but I don’t do bash scripting.
– Tommiie
7 hours ago
add a comment |
1 Answer
1
active
oldest
votes
Before executing anything of the following, please do a (recursive) copy of your top level directory—just to be safe.
Than you can achieve what you want like so:
Make the top level directory (photos) your current working directory. Then extract all the zip files:
find . -iname "*.zip" -execdir unzip {} ;
Now move the contents of the extracted directories one level up:
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. ;
This will not touch the zip files nor the extracted directories themselves, which become empty in this step. So you can delete them now:
find . -mindepth 2 -maxdepth 2 -type d -delete
Before you delete the zip files, double check that everything is okay. Then you can do the deletion with
find . -iname "*.zip" -delete
In principle you can combine these commands to a script, but I suggest to test them first one by one checking the result after each step.
A script that takes your top level directory as its sole argument, can look like this:
#!/bin/bash
cd "$1"
find . -iname "*.zip" -execdir unzip {} ;
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. ;
find . -mindepth 2 -maxdepth 2 -type d -delete
find . -iname "*.zip" -delete
If you give it the name "extract" (and set the execution permission), it can be used in its own directory like this (assuming ~/photos
as your top level directory):
./extract ~/photos
But beware: This script was never tested. It also does no tests by its own. It depends on exactly the directory and zip file structure that you describe. So please do copies and test runs.
1
The logic is fairly sound, but I'm pretty sure this will fail for extracted files with a space in their name.
– Sparhawk
6 hours ago
1
@Sparhawk: You are so right. I corrected that. (Only the argument of themv
command was affected; the{}
are expanded byfind
and are no subject to word splitting.)
– Jürgen
6 hours 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
});
}
});
JaymesRS 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%2f494964%2fbash-script-to-move-through-folders-unzip-and-move-files-up-one-directory%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
Before executing anything of the following, please do a (recursive) copy of your top level directory—just to be safe.
Than you can achieve what you want like so:
Make the top level directory (photos) your current working directory. Then extract all the zip files:
find . -iname "*.zip" -execdir unzip {} ;
Now move the contents of the extracted directories one level up:
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. ;
This will not touch the zip files nor the extracted directories themselves, which become empty in this step. So you can delete them now:
find . -mindepth 2 -maxdepth 2 -type d -delete
Before you delete the zip files, double check that everything is okay. Then you can do the deletion with
find . -iname "*.zip" -delete
In principle you can combine these commands to a script, but I suggest to test them first one by one checking the result after each step.
A script that takes your top level directory as its sole argument, can look like this:
#!/bin/bash
cd "$1"
find . -iname "*.zip" -execdir unzip {} ;
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. ;
find . -mindepth 2 -maxdepth 2 -type d -delete
find . -iname "*.zip" -delete
If you give it the name "extract" (and set the execution permission), it can be used in its own directory like this (assuming ~/photos
as your top level directory):
./extract ~/photos
But beware: This script was never tested. It also does no tests by its own. It depends on exactly the directory and zip file structure that you describe. So please do copies and test runs.
1
The logic is fairly sound, but I'm pretty sure this will fail for extracted files with a space in their name.
– Sparhawk
6 hours ago
1
@Sparhawk: You are so right. I corrected that. (Only the argument of themv
command was affected; the{}
are expanded byfind
and are no subject to word splitting.)
– Jürgen
6 hours ago
add a comment |
Before executing anything of the following, please do a (recursive) copy of your top level directory—just to be safe.
Than you can achieve what you want like so:
Make the top level directory (photos) your current working directory. Then extract all the zip files:
find . -iname "*.zip" -execdir unzip {} ;
Now move the contents of the extracted directories one level up:
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. ;
This will not touch the zip files nor the extracted directories themselves, which become empty in this step. So you can delete them now:
find . -mindepth 2 -maxdepth 2 -type d -delete
Before you delete the zip files, double check that everything is okay. Then you can do the deletion with
find . -iname "*.zip" -delete
In principle you can combine these commands to a script, but I suggest to test them first one by one checking the result after each step.
A script that takes your top level directory as its sole argument, can look like this:
#!/bin/bash
cd "$1"
find . -iname "*.zip" -execdir unzip {} ;
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. ;
find . -mindepth 2 -maxdepth 2 -type d -delete
find . -iname "*.zip" -delete
If you give it the name "extract" (and set the execution permission), it can be used in its own directory like this (assuming ~/photos
as your top level directory):
./extract ~/photos
But beware: This script was never tested. It also does no tests by its own. It depends on exactly the directory and zip file structure that you describe. So please do copies and test runs.
1
The logic is fairly sound, but I'm pretty sure this will fail for extracted files with a space in their name.
– Sparhawk
6 hours ago
1
@Sparhawk: You are so right. I corrected that. (Only the argument of themv
command was affected; the{}
are expanded byfind
and are no subject to word splitting.)
– Jürgen
6 hours ago
add a comment |
Before executing anything of the following, please do a (recursive) copy of your top level directory—just to be safe.
Than you can achieve what you want like so:
Make the top level directory (photos) your current working directory. Then extract all the zip files:
find . -iname "*.zip" -execdir unzip {} ;
Now move the contents of the extracted directories one level up:
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. ;
This will not touch the zip files nor the extracted directories themselves, which become empty in this step. So you can delete them now:
find . -mindepth 2 -maxdepth 2 -type d -delete
Before you delete the zip files, double check that everything is okay. Then you can do the deletion with
find . -iname "*.zip" -delete
In principle you can combine these commands to a script, but I suggest to test them first one by one checking the result after each step.
A script that takes your top level directory as its sole argument, can look like this:
#!/bin/bash
cd "$1"
find . -iname "*.zip" -execdir unzip {} ;
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. ;
find . -mindepth 2 -maxdepth 2 -type d -delete
find . -iname "*.zip" -delete
If you give it the name "extract" (and set the execution permission), it can be used in its own directory like this (assuming ~/photos
as your top level directory):
./extract ~/photos
But beware: This script was never tested. It also does no tests by its own. It depends on exactly the directory and zip file structure that you describe. So please do copies and test runs.
Before executing anything of the following, please do a (recursive) copy of your top level directory—just to be safe.
Than you can achieve what you want like so:
Make the top level directory (photos) your current working directory. Then extract all the zip files:
find . -iname "*.zip" -execdir unzip {} ;
Now move the contents of the extracted directories one level up:
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. ;
This will not touch the zip files nor the extracted directories themselves, which become empty in this step. So you can delete them now:
find . -mindepth 2 -maxdepth 2 -type d -delete
Before you delete the zip files, double check that everything is okay. Then you can do the deletion with
find . -iname "*.zip" -delete
In principle you can combine these commands to a script, but I suggest to test them first one by one checking the result after each step.
A script that takes your top level directory as its sole argument, can look like this:
#!/bin/bash
cd "$1"
find . -iname "*.zip" -execdir unzip {} ;
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. ;
find . -mindepth 2 -maxdepth 2 -type d -delete
find . -iname "*.zip" -delete
If you give it the name "extract" (and set the execution permission), it can be used in its own directory like this (assuming ~/photos
as your top level directory):
./extract ~/photos
But beware: This script was never tested. It also does no tests by its own. It depends on exactly the directory and zip file structure that you describe. So please do copies and test runs.
edited 6 hours ago
answered 7 hours ago
JürgenJürgen
1067
1067
1
The logic is fairly sound, but I'm pretty sure this will fail for extracted files with a space in their name.
– Sparhawk
6 hours ago
1
@Sparhawk: You are so right. I corrected that. (Only the argument of themv
command was affected; the{}
are expanded byfind
and are no subject to word splitting.)
– Jürgen
6 hours ago
add a comment |
1
The logic is fairly sound, but I'm pretty sure this will fail for extracted files with a space in their name.
– Sparhawk
6 hours ago
1
@Sparhawk: You are so right. I corrected that. (Only the argument of themv
command was affected; the{}
are expanded byfind
and are no subject to word splitting.)
– Jürgen
6 hours ago
1
1
The logic is fairly sound, but I'm pretty sure this will fail for extracted files with a space in their name.
– Sparhawk
6 hours ago
The logic is fairly sound, but I'm pretty sure this will fail for extracted files with a space in their name.
– Sparhawk
6 hours ago
1
1
@Sparhawk: You are so right. I corrected that. (Only the argument of the
mv
command was affected; the {}
are expanded by find
and are no subject to word splitting.)– Jürgen
6 hours ago
@Sparhawk: You are so right. I corrected that. (Only the argument of the
mv
command was affected; the {}
are expanded by find
and are no subject to word splitting.)– Jürgen
6 hours ago
add a comment |
JaymesRS is a new contributor. Be nice, and check out our Code of Conduct.
JaymesRS is a new contributor. Be nice, and check out our Code of Conduct.
JaymesRS is a new contributor. Be nice, and check out our Code of Conduct.
JaymesRS 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.
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%2f494964%2fbash-script-to-move-through-folders-unzip-and-move-files-up-one-directory%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
3
What have your tried?
– Peschke
9 hours ago
I may attempt a solution in python but I don’t do bash scripting.
– Tommiie
7 hours ago