pindahkan file berdasarkan daftar dalam file (dengan spasi kosong terkemuka)

12

Saya memiliki file yang berisi nama file. Sebagai contoh:

/tmp/list.txt (itu dengan spasi di awal setiap baris):

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

Saya ingin, menggunakan satu baris, untuk memindahkan semua file yang tercantum dalam /tmp/list.txtuntuk/app/dest

Jadi harus seperti ini:

cat /tmp/list.txt | xargs mv /app/dest/
Nir
sumber

Jawaban:

21

Anda hanya melewatkan -topsi untuk mv(dengan asumsi GNU mv):

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

atau lebih pendek (terinspirasi oleh jawaban X Tian):

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

ruang utama (dan kemungkinan trailing) dihilangkan. Spasi dalam nama file akan menyebabkan masalah.

Jika Anda memiliki spasi atau tab atau tanda kutip atau garis miring terbalik dalam nama file, dengan asumsi GNU xargsAnda dapat menggunakan:

sed 's/^ *//' < /tmp/list.txt | xargs -d '\n' mv -t /app/dest/
Anthon
sumber
Terima kasih atas jawabannya . dengan ini saya dapat membuat daftar banyak file dengan [!] di namanya, dan pindah ke folder lain, dengan mengikuti: ls | grep -e ". [!]]" | tee 001.txt; sed 's / ^ * //' <001.txt | xargs -d '\ n' mv -t / destinypath /
inukaze
6

Dengan asumsi nama file Anda relatif waras (tidak ada baris baru atau karakter aneh):

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

Untuk berurusan dengan nama file aneh (rusak jika nama file memiliki baris baru):

while IFS= read -r file; do mv "$file" /app/dest/; done < list.txt 
terdon
sumber
Hai terdon, bagaimana cara memindahkan folder ke direktori baru berdasarkan kecocokannya dalam file csv? Bisakah Anda membantu saya dengan ini [ unix.stackexchange.com/questions/433068/... Terima kasih !!
user3351523
@ user3351523 pertanyaan Anda telah ditutup. Meminta bantuan orang secara acak tidak akan mengubah itu. Alih-alih, edit pertanyaan, dan jelaskan bagaimana solusi dalam duplikat tidak membantu Anda. Jika sesuatu "tidak berhasil", jelaskan bagaimana itu gagal. Solusinya harus bekerja untuk Anda, jadi Anda perlu menjelaskan apa yang terjadi ketika Anda mencobanya.
terdon
Saya melakukan itu. Anda dapat melihatnya.
user3351523
@ user3351523 Anda belum menjelaskan mengapa solusi korban penipuan gagal untuk Anda. Dan Anda belum menjelaskan bagaimana jawaban yang Anda dapatkan gagal. Anda mungkin hanya perlu menggunakan cp -Hrtetapi saya tidak tahu apakah OSX cpmendukungnya.
terdon
3
for i in $(cat /tmp/list.txt); do mv "$i" /app/dest/; done
mavillan
sumber
1

Xargs murni membaca langsung dari file

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

edit 1 - setelah komentar @Anthon di bawah,

xargs -I{} < flist  mv -v {} /app/dst
X Tian
sumber
1
-isudah usang, dan itu, atau itu pengganti -I menyiratkan -l/ --max-lines=1. Dan itu menyebabkan mvdieksekusi untuk setiap file secara terpisah.
Anthon
0
mv `cat /tmp/list.txt` /app/dest/

(spasi pada awal diabaikan)

Espen Mikal Robertsen
sumber