Jika Anda menggunakan xargs -0 , Anda harus mencocokkannya dengan find -0
itsbruce
1
@ MichaelKjörling, tanpa mengutip {} tidak ada bedanya. {} diperluas dengan find, bukan shell. Perbaikan tidak akan menggunakan echoyang memperluas urutan melarikan diri seperti \b(setidaknya konforman Unix echo).
Stéphane Chazelas
1
@sch Apakah Anda yakin? Halaman findmanual ditampilkan find . -type f -exec file '{}' \;di EXAMPLESbagian. Mungkin beberapa kerang akan memperlakukan kawat gigi secara khusus.
QuasarDonkey
1
Kutipan tidak membahayakan tetapi tidak membuat perbedaan. Semua '{}', \{\}, {}, "{}", '{'}diperluas oleh shell (apapun Bourne-seperti shell) untuk satu argumen untuk menemukan bahwa adalah dua karakter "{" dan "}". Ganti "menemukan" dengan "echo menemukan", atau printf '<%s>\n' findjika Anda ingin melipatgandakan-cek.
Apa yang Anda sebutkan adalah salah satu masalah dasar yang dihadapi orang, ketika mereka mencoba membaca nama file. Terkadang, orang-orang dengan pengetahuan terbatas dan memiliki kesalahpahaman tentang struktur file dan folder cenderung lupa bahwa " Dalam UNIX Semuanya adalah file ". Jadi mereka tidak mengerti bahwa mereka perlu menangani spasi juga, karena nama file dapat terdiri dari 2 kata atau lebih dengan spasi.
Solusi: Jadi salah satu cara yang lebih dikenal untuk melakukan ini adalah dengan melakukan pembacaan yang bersih .
Kita di sini akan membaca semua file yang ada dan menyimpannya dalam sebuah variabel, lain kali ketika melakukan pemrosesan yang diinginkan kita hanya perlu menyimpan variabel itu di dalam tanda kutip yang akan menjaga nama file dengan spasi. Ini adalah salah satu cara dasar untuk melakukannya, namun, jawaban lain yang diberikan oleh orang lain di sini juga berfungsi.
Di sini saya membaca file dengan memberikan path kepada mereka dan apa pun yang saya baca saya menyimpannya di dalam variabel I, yang akan saya kutip di kemudian hari saat memprosesnya untuk melestarikan ruang sehingga memprosesnya dengan benar.
Semoga ini bisa membantu Anda dalam beberapa cara.
"Semuanya adalah file" mengacu pada sesuatu yang lain. Solusi Anda spesifik untuk GUN dan tidak mengatasi karakter garis miring terbalik atau baris baru dalam nama file. "while read" loop in shells (IMO) seringkali merupakan indikasi praktik skrip shell yang buruk.
Stéphane Chazelas
@sch: huh, dan saya dulu berpikir, tidak apa-apa. Terima kasih telah menunjukkan itu. Saya mungkin perlu melihatnya lebih lanjut.
The Dark Knight
maaf, maksud saya "GNU", bukan "GUN" di atas (ini pertama kalinya saya menyadari bahwa itu adalah anagram BTW ...)
Stéphane Chazelas
1
Cukup dengan finddan bash:
find .-name '*.jpg'-exec bash -c '
echo "treating file $1 in bash, from path : ${1%/*}"
'--{} \;
Dengan cara ini, kami menggunakan $1dalam bash, seperti dalam naskah dasar, yang membuka perspektif yang bagus untuk melakukan tugas-tugas lanjutan (atau tidak).
Cara yang lebih efisien (untuk menghindari keharusan memulai bash baru untuk setiap file):
find .-name '*.jpg'-exec bash -c 'for i do
echo "treating file $i in bash, from path : ${i%/*}"
done'--{}+
Sementara itu bekerja di zsh (di mana fitur berasal dari) dan dengan ksh93 (dengan set -G), itu tidak boleh digunakan dalam bash karena versi bash rusak secara mendasar (seperti GNU grep -r) karena turun ke symlink ke direktori (setara dengan find -Latau zsh's ***/*.jpg). Juga perhatikan bahwa bertentangan dengan menemukan, itu akan menghapus dotfiles dan tidak turun ke dotdirs (secara default).
$i
? Saya melakukan itu dan itu berfungsi dengan baik. Apakah ada yang salah dengan pendekatan itu?Jawaban:
Cara kanonik adalah melakukan
(ganti
\;
dengan+
untuk meneruskan lebih dari satu fileecho
sekaligus)atau (spesifik GNU, meskipun beberapa BSD sekarang juga memilikinya):
zsh:
sumber
echo
yang memperluas urutan melarikan diri seperti\b
(setidaknya konforman Unixecho
).find
manual ditampilkanfind . -type f -exec file '{}' \;
diEXAMPLES
bagian. Mungkin beberapa kerang akan memperlakukan kawat gigi secara khusus.'{}'
,\{\}
,{}
,"{}"
,'{'}
diperluas oleh shell (apapun Bourne-seperti shell) untuk satu argumen untuk menemukan bahwa adalah dua karakter "{" dan "}". Ganti "menemukan" dengan "echo menemukan", atauprintf '<%s>\n' find
jika Anda ingin melipatgandakan-cek.Jawaban yang lebih baik telah diberikan.
Tetapi perhatikan bahwa spasi bukan satu-satunya masalah dalam kode yang Anda berikan. tab, baris baru dan karakter wildcard juga merupakan masalah.
Dengan
Maka hanya karakter baris baru yang menjadi masalah.
sumber
Apa yang Anda sebutkan adalah salah satu masalah dasar yang dihadapi orang, ketika mereka mencoba membaca nama file. Terkadang, orang-orang dengan pengetahuan terbatas dan memiliki kesalahpahaman tentang struktur file dan folder cenderung lupa bahwa " Dalam UNIX Semuanya adalah file ". Jadi mereka tidak mengerti bahwa mereka perlu menangani spasi juga, karena nama file dapat terdiri dari 2 kata atau lebih dengan spasi.
Solusi: Jadi salah satu cara yang lebih dikenal untuk melakukan ini adalah dengan melakukan pembacaan yang bersih .
Kita di sini akan membaca semua file yang ada dan menyimpannya dalam sebuah variabel, lain kali ketika melakukan pemrosesan yang diinginkan kita hanya perlu menyimpan variabel itu di dalam tanda kutip yang akan menjaga nama file dengan spasi. Ini adalah salah satu cara dasar untuk melakukannya, namun, jawaban lain yang diberikan oleh orang lain di sini juga berfungsi.
SCRIPT:
Di sini saya membaca file dengan memberikan path kepada mereka dan apa pun yang saya baca saya menyimpannya di dalam variabel I, yang akan saya kutip di kemudian hari saat memprosesnya untuk melestarikan ruang sehingga memprosesnya dengan benar.
Semoga ini bisa membantu Anda dalam beberapa cara.
sumber
Cukup dengan
find
danbash
:Dengan cara ini, kami menggunakan
$1
dalam bash, seperti dalam naskah dasar, yang membuka perspektif yang bagus untuk melakukan tugas-tugas lanjutan (atau tidak).Cara yang lebih efisien (untuk menghindari keharusan memulai bash baru untuk setiap file):
sumber
Di versi bash terbaru, Anda dapat menggunakan
globstar
opsi:Untuk tindakan sederhana, Anda bahkan dapat melewatkan loop sepenuhnya:
sumber
set -G
), itu tidak boleh digunakan dalam bash karena versi bash rusak secara mendasar (seperti GNUgrep -r
) karena turun ke symlink ke direktori (setara denganfind -L
atau zsh's***/*.jpg
). Juga perhatikan bahwa bertentangan dengan menemukan, itu akan menghapus dotfiles dan tidak turun ke dotdirs (secara default).