find
perintah dapat digunakan cukup ringkas dalam kasus sederhana di mana Anda ingin melakukan operasi pada pencocokan nama file wildcard (atau lebih kompleks). Teknik di bawah ini dapat dikomit ke memori ... hampir!
Ini berfungsi dengan membiarkan find
perintah jalankan perintah lain pada setiap nama file yang ditemukannya. Anda dapat menjalankan contoh ini menggunakan echo
bukannya/di depan mv
.
Jika kita ingin memindahkan semua file di direktori saat ini dengan nama awal 'laporan', ke direktori paralel lain bernama 'laporan' :
find . -name "report*.*" -exec mv '{}' ../reports/ \;
String karakter pengganti harus dalam tanda kutip, {} yang menandai nama file yang 'ditemukan' harus dalam tanda kutip, dan titik koma terakhir harus di-escape - semua karena perlakuan Bash/Shell terhadap karakter tersebut.
Lihatlah halaman manual untuk find
untuk lebih banyak kegunaan:https://linux.die.net/man/1/find
Mari kita bahas sebentar tentang cara kerja wildcard.
cp *.txt foo
sebenarnya tidak memanggil cp
dengan argumen *.txt
, jika ada file yang cocok dengan gumpalan itu. Sebaliknya, ini menjalankan sesuatu seperti ini:
cp a.txt b.txt c.txt foo
Demikian pula, sesuatu seperti
mv *.txt *.old
... tidak mungkin tahu apa yang harus dilakukan, karena ketika dipanggil, yang dilihatnya adalah:
mv a.txt b.txt c.txt *.old
atau, lebih buruk lagi, jika Anda sudah memiliki file bernama z.old
, itu akan melihat:
mv a.txt b.txt c.txt z.old
Jadi, Anda perlu menggunakan alat yang berbeda. Pertimbangkan:
# REPLACES: mv /data/*/Sample_*/logs/*_Data_time.err /data/*/Sample_*/logs/*_Data_time_orig.err
for f in /data/*/Sample_*/logs/*_Data_time.err; do
mv "$f" "${f%_Data_time.err}_Data_time_orig.err"
done
# REPLACES: cp /data/*/Sample_*/scripts/*.sh /data/*/Sample_*/scripts/*_orig.sh
for f in /data/*/Sample_*/scripts/*.sh; do
cp "$f" "${f%.sh}_orig.sh"
done
# REPLACES: sh /data/*/Sample_*/scripts/*_orig.sh
for f in /data/*/Sample_*/scripts/*_orig.sh; do
if [[ -e "$f" ]]; then
# honor the script's shebang and let it choose an interpreter to use
"$f"
else
# script is not executable, assume POSIX sh (not bash, ksh, etc)
sh "$f"
fi
done
Ini menggunakan perluasan parameter untuk menghapus ujung ekor nama lama sebelum menambahkan nama baru.