At the Linux command line, I'd like to copy a (very large) set of .txt
files from one directory (and its subdirectories) to another.
I need the directory structure to stay intact, and I need to ignore files except those ending in .txt
.
Super User is a question and answer site for computer enthusiasts and power users. It only takes a minute to sign up.
Sign up to join this communityAt the Linux command line, I'd like to copy a (very large) set of .txt
files from one directory (and its subdirectories) to another.
I need the directory structure to stay intact, and I need to ignore files except those ending in .txt
.
cd /source/path
find -type f -name \*.txt -exec install -D {} /dest/path/{} \;
.
after find
. Also on macOS 10.13.1, this worked: find . -type f -name "*.txt" -exec install -v {} /dest/path/{} \;
Easiest way that worked for me:
cp --parents -R jobs/**/*.xml ./backup/
one catch is you have to navigate to the "desired" directory before so the "parent path" is correct.
Also make sure that you enabled recursive globs in bash:
shopt -s globstar
Another approach
find . -name '*.txt' -exec rsync -R {} /path/to/destdir \;
find . -iname '*.txt' -exec rsync -Rptgon {} path/to/dext \;
to do a case insensitive match and to preserver ownership and permissions.
Mar 4, 2018 at 8:25
how about you first copy it over with
cp -r /old/folder /new/folder
then go to the new folder and run
find . -type f ! -iname "*.txt" -delete
or just
cp -r /old/folder /new/folder && find . -type f ! -iname "*.txt" -delete
Edit: ok you want one command which filters (I have not tested this because my system doesn't have the cpio
command!). Here is where I found it: http://www.gnu.org/software/findutils/manual/html_mono/find.html#Copying-A-Subset-of-Files
find . -name "*.txt" -print0 |
cpio -pmd0 /dest-dir
Please test this first, because I haven't tried it yet. If someone would verify, that would be great.
0
in -pmd0
and add -print0
to the end of the find
command (just before the |
).
Sep 11, 2014 at 21:51
I was trying to do the same thing on macOS, but none of the options really worked for me. Until i discovered ditto
.
I had to copy many .wav files, and have it skip Video files... So here is what I came up with:
find . -type f -iname "*.wav" -ls -exec ditto {} /destination/folder/{} \;
find .
- Runs find in current folder. make sure you cd /source/folder
before you start
-type f
- Specifies to only look for files
-iname "*.wav"
- This tells it to look for case insensitive *.wav-ls
- This shows you the file that it is working on. Otherwase it shows nothing.-exec ditto {} /destination/folder/{} \;
- Does all the work of copying and creating the files with the same directory tree.Navigate to directory:
find . -regex '<regexp_to_get_directories_and_files_you_want>' | xargs -i cp -r --parents {} path/to/destination
It s a bit more straight forward and mighty, if you manage regular expressions.
Navigate to directory:
cp '*.css' /path/to/destination
You'll have to navigate to each folder in the directory, but this is better than most of the options I've seen so far.