Saya memiliki file .txt yang berisi teks seperti ini
A1/B1/C1
A2/B2/C2
A3/B3/C3
Saya ingin skrip yang membaca file .txt untuk setiap baris kemudian membuat direktori berdasarkan kata pertama (A1, A2, A3)
Saya telah membuat skrip seperti ini:
file="test.txt"
while IFS='' read -r line
do
name="line"
mkdir -p $line
done <"$file"
Ketika saya menjalankannya, ia menciptakan direktori A1 kemudian juga membuat sub-direktori B1 dan C1. hal yang sama terjadi pada saluran lain (A2 * dan A3 *)
Apa yang harus saya lakukan untuk membuat hanya direktori A1, A2, A3?
Saya tidak ingin membuat nama seperti A1 / B1 / C1 dengan karakter '/' di dalamnya. Saya hanya ingin mengambil kata sebelum karakter '/' dan menjadikannya nama direktori. Hanya "A1" "A2" "A3".
sumber
xargs -a<(....)
bukan<dirlist.txt cut -d/ -f1 | xargs
?tr
pendekatan saya - baru menyadari bahwaparallel
sudah dibahas secara default.xargs -a<(....)
bukan pipa - karena saya suka seperti ini, sesederhana itu. :)<(...)
membantu dengan spasi juga, jadi itu jelas pilihan yang lebih baik - saya tidak berpikir siapa pun menggunakan deskriptor file ini pula.cut <dirlist.txt
bukannya adilcut dirlist.txt
?Anda perlu mengatur
IFS='/'
untukread
dan kemudian menetapkan masing-masing bidang pertama ke dalam variabel yang terpisahfirst
dan sisa bidang ke dalam variabelrest
dan hanya bekerja pada nilai bidang pertama (Atau Anda bisaread -ar array
ke satu array dan gunakan"${array[0]}"
untuk nilai bidang pertama.):Atau dalam satu baris untuk mereka yang menyukainya:
Atau buat semua direktori dalam sekali jalan:
The ANSI-C Mengutip
$'...'
digunakan untuk menangani nama direktori yang berisi karakter khusus.Perhatikan bahwa
_
(dapat berupa karakter atau string) di akhir akan menjadi argv [0] kebash -c '...'
dan$@
akan berisi sisa parameter mulai dari 1; tanpa itu di perintah kedua parameter pertama kemkdir
akan hilang.Dalam
${1%%/*}
menggunakan ekspansi substitusi parameter shell (POSIX sh / bash / Korn / zsh) , menghapus kecocokan terpanjang yang mungkin dari sebuah slash diikuti oleh apa pun hingga akhir parameter lewat ke dalamnya yang merupakan garis yang dibaca oleh xargs ;Ps:
echo
di depanmkdir
untuk membuat direktori tersebut.-d'\n'
dengan-0
jika daftar Anda dipisahkan dengan karakter NUL dan bukan\n
ewline (seharusnya ada / tertanam baris baru dalam nama direktori Anda).sumber
Isi dari
test.txt
:Script untuk membuat
A[123]
folder:Output dari
ls
:sumber
A 12"x4" dir/B b/C c
:?Untuk kasus sederhana seperti yang ditunjukkan pada contoh input pertanyaan, cukup gunakan
cut
dan berikan output kemkdir
viaxargs
Untuk menangani kasus-kasus di mana nama direktori dapat berisi spasi, kami dapat menambahkan
-d '\n'
ke daftar opsi:Untuk variasi yang lebih kompleks, seperti yang
A 12"x4" dir/B b/C c
disarankan oleh @OleTange dalam komentar, orang dapat beralihawk
untuk membuat daftar yang dipisahkan nol alih-alih daftar yang dipisahkan baris baru.@dabut dalam komentar bertanya-tanya apakah
printf
dapat digunakan sebagai ganticut
, dan secara teknis dapat digunakan, misalnya melalui membatasi string yang dicetak hanya dengan lebar 3 karakter saja:Bukan cara terbersih, tetapi terbukti
printf
bisa digunakan. Tentu saja, ini menjadi bermasalah jika nama direktori menjadi lebih dari 3 karakter.sumber
A 12"x4" dir/B b/C c
:?menggunakan Perl:
Atau
jika kita ingin menerima spasi pada dir-names
sumber
perl -ne 'mkdir for /^([^\/]+)/' list.txt
untuk menutupi spasi dalam nama dir. Saya akhirnya perlu belajar Perl - terima kasih!GNU Parallel mungkin berlebihan untuk tugas tersebut, tetapi jika Anda akan melakukan hal-hal lain untuk setiap baris, maka mungkin berguna:
Ini berkaitan dengan input seperti:
sumber