I needed to find all the image files in a large directory tree and then copy them to a new directory tree while preserving the directory structure. Here’s my solution:
1. Find the files and save list to a file:
1 |
find httpdocs/ -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -f 1 -d ":" > /tmp/f |
This command demonstrates using the -exec option on “find” to feed the “file” command.
2. Copy each file on the list, creating sub directories as needed:
1 |
while IFS= read -r line; do cp --parents "$line" images/; done < /tmp/f |
This command demonstrates a one line while loop feed by input redirection. Also notice the “–parents” option on the “cp” command.