Saya punya jawaban yang memalukan di sini sebelumnya, tetapi jawaban Denis mengingatkan saya bahwa saya melewatkan hal yang paling mendasar. Jadi, saya menghapus jawaban asli saya. Tetapi karena tidak ada yang mengatakan hal yang sangat mendasar ini, saya pikir ada baiknya untuk meletakkannya di sini.
Pertanyaan aslinya adalah "Saya memiliki file teks dengan daftar nama file yang dipisahkan oleh ruang. Bagaimana saya bisa menyalinnya ke satu direktori target." Pada awalnya ini mungkin tampak rumit atau rumit, karena Anda berpikir Anda harus mengekstraksi item dari file dengan cara tertentu. Namun, ketika shell memproses sebuah baris perintah, hal pertama yang dilakukannya adalah memisahkan daftar argumen menjadi token dan (di sini sedikit yang tidak ada yang mengatakan langsung) spasi token yang terpisah . (Newlines juga memisahkan token yang mengapa pengujian Doug Harris dengan daftar yang dipisahkan dengan baris baru memiliki hasil yang sama.) Yaitu, shell mengharapkan dan sudah dapat menangani daftar yang dipisahkan oleh ruang.
Jadi yang perlu Anda lakukan di sini adalah meletakkan daftar yang dipisahkan oleh ruang (yang sudah Anda miliki) ke tempat yang tepat dalam perintah Anda. Perintah Anda adalah beberapa variasi dalam hal ini:
cp file1 file2 file3...file# target
Satu-satunya kerutan adalah Anda ingin mendapatkan daftar file 1 hingga # dari file teks Anda.
Seperti yang ditunjukkan oleh Dennis dalam komentarnya, upaya awal Anda ( cp
cat list.txt new_folder
) seharusnya sudah berhasil. Mengapa? Karena perintah internal cat list.txt
diproses terlebih dahulu oleh shell dan berkembang menjadi file1 file2 file3...file#
, yang persis seperti yang diharapkan dan diinginkan shell pada bagian perintah itu. Jika tidak berhasil maka (1) Anda salah ketik atau (2) nama file Anda entah bagaimana aneh (mereka memiliki spasi atau karakter tidak biasa lainnya).
Alasan semua jawaban Dennis bekerja adalah karena mereka menyediakan daftar file yang diperlukan untuk cp
dikerjakan, menempatkan daftar itu di tempat yang termasuk dalam seluruh perintah. Sekali lagi, perintah itu sendiri adalah struktur ini:
cp list-of-files target_directory
Sangat mudah untuk melihat bagaimana semua ini menyatu dalam versi ini:
cp $(<list.txt) new_folder
$()
menyebabkan shell menjalankan perintah di dalam tanda kurung dan kemudian mengganti outputnya pada titik tersebut di baris yang lebih besar. Kemudian shell menjalankan garis secara keseluruhan. Omong-omong, $()
adalah versi yang lebih modern dari apa yang sudah Anda lakukan dengan backticks (`). Berikutnya: <
adalah operator pengalihan file. Ia memberi tahu shell untuk membuang konten list.txt
ke input standar. Karena $()
bit diproses terlebih dahulu, inilah yang terjadi secara bertahap:
cp $(<list.txt) new_folder
# split line into three tokens: cp, $(<list.txt), new_folder
cp file1 file2 file3...file# new_folder
# substitute result of $(<list.txt) into the larger command
Jelas langkah 2 hanyalah cp
perintah normal yang Anda inginkan.
Saya menyadari bahwa saya sering mengalahkan kuda ini (mungkin sangat mati), tetapi saya pikir ini layak dilakukan. Memahami persis bagaimana shell memproses suatu perintah dapat membantu Anda untuk menulisnya dengan lebih baik dan menyederhanakan banyak hal. Ini juga akan menunjukkan kepada Anda di mana masalah cenderung bersembunyi. Dalam kasus ini, misalnya, pertanyaan pertama saya kepada Anda seharusnya tentang nama file lucu atau kemungkinan kesalahan ketik. Tidak diperlukan akrobat.