Saya mencoba untuk mengeksekusi skrip bash ini yang mengulang file (yang memiliki spasi dalam nama) di direktori saat ini dan membuat folder baru dengan karakter pertama file (jika belum dibuat) dan memindahkan file itu ke folder . Ini kode saya:
for i in `/bin/ls | xargs`
do
dir=`echo "$i" | cut -c 1 -`
mkdir -m777 -p "$dir"
mv "$i" "$dir"
done
Masalah dengan ini tampaknya karena ia memperlakukan setiap kata dalam file sebagai file terpisah, jadi meskipun ia membuat folder dengan benar, itu tidak dapat memindahkan file ke folder itu karena nama file yang dicari adalah hanya kata pertama dari file aktual. Saya melihat jawaban lain untuk pertanyaan serupa tetapi ini adalah yang terdekat yang bisa saya dapatkan.
EDIT: Saya mengganti "for i in /bin/ls | xargs
" dengan "for i in *" seperti yang disarankan @steeldriver, dan meskipun itu memperbaiki masalah asli saya, saya mendapatkan kesalahan seperti ini:
mv: cannot move '`' to a subdirectory of itself, '`/`'
mv: invalid option -- ' '
mv: missing destination file operand after '-'
mv: invalid option -- '.'
mv: invalid option -- ')'
mv: invalid option -- '+'
mv: cannot move ''$'\340' to a subdirectory of itself, ''$'\340''/'$'\340'
mv: cannot move ''$'\303' to a subdirectory of itself, ''$'\303''/'$'\303'
mv: cannot move ''$'\305' to a subdirectory of itself, ''$'\305''/'$'\305'
mv: invalid option -- '1'
Saya pikir beberapa file ini mungkin dimulai dengan karakter non-ascii (saya tidak dapat melihat konten karena ada terlalu banyak file). Apakah ada cara untuk menangani kasus ini?
sumber
for i in *; do ...
- lihat Bash Pitfall # 1ls
. Anda mungkin harus melihat ke dalam menggunakanfind
atau shell globbing sederhana untuk mendapatkan daftar file Anda untuk diproses. Bacaan lebih lanjut tentang subjek ini dapat ditemukan di sini .t
.Jawaban:
Untuk mengulang file dengan spasi di namanya, shellnya banyak, tidak perlu memanggil
ls
:Dan untuk memproses setiap file yang terdaftar (yang termasuk direktori) Anda harus memeriksa bahwa nama file adalah file (bukan direktori) dan juga memeriksa apakah direktori tersebut tidak ada sebelum membuatnya.
sumber
Dengan GNU Parallel, tampilannya seperti ini:
(Sunting: Baru saja dicatat Anda meminta file - bukan dir. / Dihapus).
sumber