ganti nama mereka, bagaimana? Jika Anda mengganti pembatas direktori dengan sesuatu - misalkan menggarisbawahi (_), Anda mungkin mendapatkan tabrakan dengan file, yang sudah berisi garis bawah. Itu berlaku untuk setiap karakter yang valid, dan selain / dan \ 0, yang dilarang dalam nama file, tidak ada pelabuhan yang aman - karakter apa pun dapat menghasilkan tabrakan.
pengguna tidak diketahui
Apakah folder memiliki subfolder, atau hanya folder sederhana, struktur lebar?
pengguna tidak diketahui
Jawaban:
8
Ini dia:
for file in/home/user/temps/*/thumb.png;do new_file=${file/temps/new_folder}; cp "$file""${new_file/\/thumb/}";done;
edit:
omong-omong kanonis, omong-omong, adalah bahwa menggunakan finduntuk ini adalah ide yang buruk - hanya menggunakan ekspansi shell jauh lebih dapat diandalkan. Juga, ini mengasumsikan bash, tapi saya pikir itu asumsi yang aman :)
edit 2:
untuk kejelasan, saya akan memecahnya:
# shell-expansion to loop specified filesfor file in/home/user/temps/*/thumb.png;do# replace 'temps' with 'new_folder' in the path# '/home/temps/abc/thumb.png' becomes '/home/new_folder/abc/thumb.png'
new_file=${file/temps/new_folder};# drop '/thumb' from the path# '/home/new_folder/abc/thumb.png' becomes '/home/new_folder/abc.png'
cp "$file""${new_file/\/thumb/}";done;
detail pada ${var/Pattern/Replacement}konstruk dapat ditemukan di sini .
tanda kutip di cpbaris penting untuk menangani spasi dan baris baru, dll. dalam nama file.
new_file = new_folder? Apa tujuan dari garis miring terbalik di depan garis miring new_file/\/thumb?
pengguna tidak diketahui
1
@user: ${VARIABLE/PATTTERN/REPLACEMENT}menghasilkan nilai VARIABLEtetapi dengan pola yang diganti oleh teks pengganti. Di sini polanya /thumb( /kebutuhan untuk melarikan diri sehingga tidak terlihat ${new_file//PATTERN/REPLACEMENT}, yang menjadikannya pengganti global alih-alih pengganti yang muncul pertama kali) dan teks pengganti kosong.
Gilles 'SO- stop being evil'
Tentu saja, sekarang saya melihatnya. :)
pengguna tidak diketahui
1
Anda mengasumsikan bahwa 487 direktori berada langsung di bawah /home/user/temps, yang tidak jelas dari pertanyaan. Jika tidak, Anda perlu mencari atau **.
Bagian interessting adalah ekspansi parameter${NAME//\//_} . Dibutuhkan konten NAME, dan menggantikan setiap kejadian /dengan _.
Catatan: hasilnya tergantung pada direktori kerja dan parameter path untuk find. Saya menjalankan perintah dari direktori induk temps. Ganti cpdengan echopercobaan.
Gagal pada file yang berisi baris baru dalam namanya.
pengguna tidak diketahui
Itu bekerja dengan sangat baik. satu hal lagi, saya punya beberapa file zip di beberapa sub direktori juga. apakah mungkin untuk mengekstrak imgae dari sana juga. ingat 'zip not tar'
mkdir /home/user/thumbs
targDir=/home/user/thumbs
cd /home/user/temps
find .-type d |while IFS="" read -r dir ;doif[[-f "${dir}"/thumb.png ]];then
echo mv -i "${dir}/thumb.png""${targDir}/${dir}_thumb.png"fidone
Edit
Saya telah menambahkan penawaran jika ada nama dir Anda yang memiliki karakter white-space yang tertanam di dalamnya.
Saya juga telah mengubah ini jadi itu hanya akan mencetak perintah yang akan dieksekusi. Periksa output skrip untuk memastikan semua file / nama path terlihat benar. Saat Anda yakin tidak ada masalah dengan perintah yang akan dieksekusi, hapus echo.
Saya punya beberapa file png di beberapa subfolder lagi, dapatkah itu bekerja
Mirage
untuk mv -i ./A A/thumb.png ../tmp/.pngfolder "A A" saya, ia menghasilkan: - semua file diakhiri dengan ../tmp/.png (../tmp adalah dir target saya).
pengguna tidak diketahui
Tambahkan tanda kutip dan kurung kurawal di sekitar semua variabel dalam kode di atas, yaitu "$ {dir}"
shellter
@ Mirror51 menulis: "file dalam beberapa subfolder lagi, apakah itu akan berfungsi". Ya seharusnya. Tahukah Anda bahwa Anda dapat menjalankan setiap langkah skrip ini secara terpisah (atau saat disatukan, setiap set pipa). Anda dapat menjalankan find -type ddan melihat hasilnya. Apakah itu mendapatkan semua direktori yang Anda harapkan? Seharusnya, jika tidak, tambahkan beberapa output untuk menunjukkan masalah. Semoga berhasil.
shellter
Tidak akan bekerja read dirmelakukan pemisahan kata, dan mengambil, dari direktori a\nba dan b sebagai dua contoh, yang tidak bisa diselesaikan oleh masking.
pengguna tidak diketahui
-1
Untuk menyalin Anda memerlukan perintah cp , dan untuk mengganti nama untuk linux sama dengan memindahkan file, jadi Anda harus melakukannya dengan perintah mv . Di Linux Anda selalu harus menentukan keseluruhan path, dari sumbernya, jika Anda berada di folder lain, dan ke folder tujuan, tentu saja. Saya akan menjadi seperti ini, untuk salinan:
Jawaban:
Ini dia:
edit:
omong-omong kanonis, omong-omong, adalah bahwa menggunakan
find
untuk ini adalah ide yang buruk - hanya menggunakan ekspansi shell jauh lebih dapat diandalkan. Juga, ini mengasumsikanbash
, tapi saya pikir itu asumsi yang aman :)edit 2:
untuk kejelasan, saya akan memecahnya:
detail pada
${var/Pattern/Replacement}
konstruk dapat ditemukan di sini .tanda kutip di
cp
baris penting untuk menangani spasi dan baris baru, dll. dalam nama file.sumber
new_file/\/thumb
?${VARIABLE/PATTTERN/REPLACEMENT}
menghasilkan nilaiVARIABLE
tetapi dengan pola yang diganti oleh teks pengganti. Di sini polanya/thumb
(/
kebutuhan untuk melarikan diri sehingga tidak terlihat${new_file//PATTERN/REPLACEMENT}
, yang menjadikannya pengganti global alih-alih pengganti yang muncul pertama kali) dan teks pengganti kosong./home/user/temps
, yang tidak jelas dari pertanyaan. Jika tidak, Anda perlu mencari atau**
.Ini berfungsi untuk subdirektori dalam yang sewenang-wenang:
Bagian interessting adalah ekspansi parameter
${NAME//\//_}
. Dibutuhkan kontenNAME
, dan menggantikan setiap kejadian/
dengan_
.Catatan: hasilnya tergantung pada direktori kerja dan parameter path untuk find. Saya menjalankan perintah dari direktori induk temps. Ganti
cp
denganecho
percobaan.sumber
Kode pembantu pendek:
beri nama 'deslash.sh' dan buat itu dapat dieksekusi. Sebut saja dengan:
Ini akan gagal, jika ada tabrakan
tapi itu tidak bisa dihindari.
sumber
Coba ini
Edit
Saya telah menambahkan penawaran jika ada nama dir Anda yang memiliki karakter white-space yang tertanam di dalamnya.
Saya juga telah mengubah ini jadi itu hanya akan mencetak perintah yang akan dieksekusi. Periksa output skrip untuk memastikan semua file / nama path terlihat benar. Saat Anda yakin tidak ada masalah dengan perintah yang akan dieksekusi, hapus
echo
.sumber
mv -i ./A A/thumb.png ../tmp/.png
folder "A A" saya, ia menghasilkan: - semua file diakhiri dengan ../tmp/.png (../tmp adalah dir target saya).find -type d
dan melihat hasilnya. Apakah itu mendapatkan semua direktori yang Anda harapkan? Seharusnya, jika tidak, tambahkan beberapa output untuk menunjukkan masalah. Semoga berhasil.read dir
melakukan pemisahan kata, dan mengambil, dari direktoria\nb
a dan b sebagai dua contoh, yang tidak bisa diselesaikan oleh masking.Untuk menyalin Anda memerlukan perintah cp , dan untuk mengganti nama untuk linux sama dengan memindahkan file, jadi Anda harus melakukannya dengan perintah mv . Di Linux Anda selalu harus menentukan keseluruhan path, dari sumbernya, jika Anda berada di folder lain, dan ke folder tujuan, tentu saja. Saya akan menjadi seperti ini, untuk salinan:
atau untuk mengganti nama atau pindah
sumber
find