Single line backups with find or cat and xargs, etc


Login or Register for Dates, Times and to Reply

 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Single line backups with find or cat and xargs, etc
# 1  
Single line backups with find or cat and xargs, etc

Hi, I'm new here and this is my first post. I used command line Unix at work for 3 years... about 10 years ago! Now I can't figure out nor hunt down examples of how to do the following:
Say I built a list of file to backup like this:
Code:
find ~ -name "*.pdf" -print >> MYPDF.txt

So I am using find with a redirection operator to a plain text file. Now I want to say... cat that file and pipe it to xargs using the cp command to copy them all to a single directory so I can tar them into a tar ball... but I am screwing it up!!
Code:
mkdir NEW_PDF_DIR
cat MYPDF.txt | xargs cp NEW_PDF_DIR

then I want to do something like:
Code:
tar  -cfv PDF_ARC ./NEW_PDF_DIR

Several things going on here... trying to find to build a list to use to create a tar archive... more or less. And hey, if there is an easier/smarter way to do it, Thank you all! (I figure it can be done in 1 line at the shell prompt... but hey I am re-acquiring skills here!)

Last edited by zxmaus; 10-23-2019 at 11:11 PM..
# 2  
You might consider using something like this:

Code:
find find ~ -name "*.pdf" -exec  /your/script/or/command/here.sh {} \;

Example (not your entire solution)

Code:
find find ~ -name "*.pdf" -exec  cp {}  /new/directory \;

Anyway, I normally use -exec for these tasks with find and rarely (if ever) use xargs these days.

Hope this helps.
# 3  
Quote:
Originally Posted by hwilliam777
So I am using find with a redirection operator to a plain text file. Now I want to say... cat that file and pipe it to xargs using the cp command to copy them all to a single directory so I can tar them into a tar ball... but I am screwing it up!!
Code:
mkdir NEW_PDF_DIR
cat MYPDF.txt | xargs cp NEW_PDF_DIR

You you don't say what OS you are using some GNU options can make this task easier. If cp implementations the cp -t DIRECTORY SOURCE ... method, then this makes xargs much easier to work with:

Code:
mkdir NEW_PDF_DIR
cat MYPDF.txt | xargs --no-run-if-empty cp -t NEW_PDF_DIR

Also GNU xargs allows a --no-run-if-empty which to avoids invoking cp if no files exist to be copied.

If NEW_PDF_DIR is under your home directory, you will want to prune it to avoid trying to backup the backup files!

Code:
find ~ -path ~/NEW_PDF_DIR -prune -type f -o -name "*.pdf" -print >> MYPDF.txt

# 4  
The cp -t does the trick here, because you have the target directory first.
Both xargs and find -exec want constant arguments first.
Code:
find ~ -name "*.pdf" -exec  cp -t /new/directory {} +

Normally the cp has the target directory last. But only a few find versions allow
Code:
find ~ -name "*.pdf" -exec  cp {} /new/directory \;

or
Code:
find ~ -name "*.pdf" -exec  cp {} /new/directory +

# 5  
Does your tar version offer the -T option? man tar:
Quote:
-T, --files-from=FILE
Get names to extract or create from FILE.
If yes, try
Code:
find . -iname  "*.pdf" | tar cvf PDF_ARC -T-

tar also handles
Quote:
names in FILE are separated by ASCII NUL character, instead of LF ... generated by find(1) -print0 predicate
- should you have file names with LF chars.
# 6  
A long time ago I used find ... cpio to create tar archives. As it's a long time ago I can't find any examples, but using the GNU CPIO man page and evidence of how I used to copy directories with cpio (now I use rsync) it would have been something like this:
Code:
find -depth -name 'pattern' -print | cpio --create --format=tar > archive.tar

A SysV version would probably be more like:
Code:
find -depth -name 'pattern' -print | cpio -o -H tar > archive.tar

Of course, this was in the days when you couldn't pipe find into tar to list the files you wanted to archive...

Andrew
# 7  
Thanks! Many thanks!

I or we used SysV Unix flavor and I am not sure if 'find' had 'exec' or not but I never used it. I use Linux (Ubuntu) now but thankfully Bash tolerates me dropping back to SysV type stuff. I want to get my SysV chops back then migrate forward into the brave new world, LOL.
Also I will use the code wrapper from now own when notating code like...

Code:
rm -rf /*

Wait, holy ... kidding. Oh, I also related to the cpio example... did that too.
Thank you all again!!
Login or Register for Dates, Times and to Reply

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #932
Difficulty: Easy
Most first-generation personal computers did not keep track of dates and times.
True or False?

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

To find and display the middle line in a file using single line command.

Hi all, How can i display the middle line of a file using a single line command? (6 Replies)
Discussion started by: Lakme Pemmaiah
6 Replies

2. Shell Programming and Scripting

Find 2 expressions then print in a single line

Guys, need help. I have a file that contains something like this: abc def ghi jkl I want to print the first and last line of the file and the output should be in a single line. so, output should be like this: abc jkl (3 Replies)
Discussion started by: solidhelix08
3 Replies

3. UNIX for Dummies Questions & Answers

find/xargs/*grep: find multi-line empty "try-catch" blocks - eg, missing ; not in a commented block

How can I recursively find all files in a directory and print out the file and first line number of any text blocks that match the below cases? This would seem to involve find, xargs, *grep, regex, etc. In summary, I want to find so-called empty "try-catch blocks" that do not contain code... (0 Replies)
Discussion started by: lifechamp
0 Replies

4. UNIX for Dummies Questions & Answers

Help on cat filelist.txt |xargs -n1 find

I am trying to find all the files listed in a filelist.txt. Why cant I use something like this cat filelist.txt | xargs -n1 find $path (2 Replies)
Discussion started by: dragonpoint
2 Replies

5. UNIX for Dummies Questions & Answers

XARGS and FIND together

I am trying to delete files older than 60 days from a folder: find /myfolder/*.dat -mtime +60 -exec rm {} \; ERROR - argument list too long: find I can't just give the folder name, as there are some files that I don't want to delete. So i need to give with the pattern (*.dat). I can... (3 Replies)
Discussion started by: risshanth
3 Replies

6. Shell Programming and Scripting

Single/Multiple Line with Special characters - Find & Replace in Unix Script

Hi, I am creating a script to do a find and replace single/multiple lines in a file with any number of lines. I have written a logic in a script that reads a reference file say "findrep" and populates two variables $FIND and $REPLACE print $FIND gives Hi How r $u Rahul() Note:... (0 Replies)
Discussion started by: r_sarnayak
0 Replies

7. Shell Programming and Scripting

Find a pattern in a single line

Hi I have to find if a pattern is present in a line. eq line="dasdasd hello asdasdasd" Have to find if "hello" is present in the line or not. Which command to be used? Thanks (10 Replies)
Discussion started by: akashtcs
10 Replies

8. Shell Programming and Scripting

find | xargs cat

Hi, I am having trouble getting a combination of commands to work. I need to traverse through all sub-directories of a certain directory and 'cat' the contents of a particular file in the sub-directories. The commands on their own work but when I combine them I get no output. The... (4 Replies)
Discussion started by: DownunderDave
4 Replies

9. Shell Programming and Scripting

cat in the command line doesn't match cat in the script

Hello, So I sorted my file as I was supposed to: sort -n -r -k 2 -k 1 file1 | uniq > file2 and when I wrote > cat file2 in the command line, I got what I was expecting, but in the script itself ... sort -n -r -k 2 -k 1 averages | uniq > temp cat file2 It wrote a whole... (21 Replies)
Discussion started by: shira
21 Replies

10. Shell Programming and Scripting

find | xargs cat

Hai I just want to find a file *.txt in particular direcotry and display the file name puls the content. Do someone know hot to do this, thanks. I try : find test/ -name '*.txt' | xargs cat but It does'nt print out the file name, i want something below print out in my screen : test/1.txt... (4 Replies)
Discussion started by: asal_email
4 Replies

Featured Tech Videos