17

I have a file that contains file names. For example:

/tmp/list.txt (it is with the spaces at the start of each line):

  /tmp/file.log
  /app/nir/home.txt
  /etc/config.cust

I want, using one line, to move all the files listed in /tmp/list.txt to /app/dest

So it should be something like this:

cat /tmp/list.txt | xargs mv /app/dest/
27

You are just missing the -t option for mv (assuming GNU mv):

cat /tmp/list.txt | xargs mv -t /app/dest/

or shorter (inspired by X Tian's answer):

xargs mv -t /app/dest/ < /tmp/list.txt

the leading (and possible trailing) spaces are removed. Spaces within the filenames will lead to problems.

If you have spaces or tabs or quotes or backslashes in the filenames, assuming GNU xargs you can use:

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/
3
  • Thank you , for the answer . with this i can make a list of lot of files with [!] in their name , and move to another folder , with the follow : ls | grep -e ".[!]]" | tee 001.txt ; sed 's/^ *//' < 001.txt | xargs -d '\n' mv -t /destinypath/ – inukaze Feb 14 '16 at 16:49
  • These don't work on OS X. "mv: illegal option -- t" – John Smith Dec 15 '20 at 9:47
  • @JohnSmith OS X is not using GNU versions of these utilities, AFAIK they use BSD versions which in general have fewer fancy options. – Anthon Dec 16 '20 at 7:37
8

Assuming your file names are relatively sane (no newlines or weird characters):

while read file; do mv "$file" /app/dest/; done < list.txt 

To deal with weird file names (breaks if a file name has a newline):

while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt 
6
  • Hi terdon, how to move folders into new directory based on their match in the csv file? Could you please help me with this [unix.stackexchange.com/questions/433068/… Thank you !! – stack_learner Mar 26 '18 at 9:59
  • @user3351523 your question has been closed. Asking random people for help won't change that. Instead, edit the question, and explain how the solutions in the duplicate didn't help you. If something "didn't work", explain how it failed. The solutions should work for you, so you need to explain what happens when you try them. – terdon Mar 26 '18 at 11:23
  • I did that. you can have a look. – stack_learner Mar 26 '18 at 11:30
  • @user3351523 you haven't explained why the solutions of the dupe fail for you. And you haven't explained how the answers you have gotten fail. You might just need to use cp -Hr but I don't know if OSX cp supports that. – terdon Mar 26 '18 at 11:41
  • Nope. On OS X (Mojave, at least), both these command lines do absolutely nothing at all. – John Smith Dec 15 '20 at 9:43
3
for i in $(cat /tmp/list.txt); do mv "$i" /app/dest/; done
1
  • Can't handle spaces in filenames. – John Smith Dec 15 '20 at 9:46
1

Pure xargs reading directly from file

xargs -l -i < flist  mv -v {} /app/dst

edit 1 -- after @Anthon 's comment below,

xargs -I{} < flist  mv -v {} /app/dst

edit 2 -- after @John Smith comment below

xargs -I{} < flist mv -v "{}" /app/dst

Quoting replace-str (see man xargs for explanation of replace-str) ensures filenames with blanks are treated as one argument. Newline becomes the input field terminator. However blank lines are ignored.

-I{} Implies the field separator is newline, and implies -L1 (use max one line for each output invocation). So mv is invoked for each input line.

2
  • 1
    -i is deprecrated, and it, or it replacement -I imply -l/--max-lines=1. And it causes mv to be executed for each file separately. – Anthon Feb 18 '14 at 16:24
  • 1
    Nope. "mv: rename {} to /app/dst/{}: No such file or directory" – John Smith Dec 15 '20 at 9:41
0
mv `cat /tmp/list.txt` /app/dest/

(spaces at start are ignored)

1
  • Can't handle spaces in filenames. – John Smith Dec 15 '20 at 9:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.