Saya harus berurusan dengan sejumlah besar file yang bersarang di dalam direktori (satu file per direktori), seperti ini:
fred/result.txt
john/result.txt
mary/result.txt
...
Saat ini saya menggunakan perintah berikut untuk memproses setiap file tersebut:
find . -maxdepth 1 -type d ( ! -name . ) -exec bash -c "cd '{}' && processResult result.txt" ;
Saya mencari sesuatu yang dapat saya tambahkan di akhir perintah ini yang akan mengubah nama file menjadi fred.txt
, dll. dan kemudian pindahkan file ke direktori induk untuk menghilangkan lapisan direktori tambahan.
Apa cara terbaik untuk melakukan ini?
Jawaban yang Diterima:
Kita dapat menggunakan pendekatan klasik :find
dengan while read
kombo:
Demo:
$ ls *
fred:
results.txt
jane:
results.txt
john:
results.txt
$> find . -type f -name "results.txt" -printf "/%Pn" | while read FILE ; do DIR=$(dirname "$FILE" );
> mv ."$FILE" ."$DIR""$DIR".txt;done
$> ls
fred/ jane/ john/
$> ls *
fred:
fred.txt
jane:
jane.txt
john:
john.txt
Gunakan echo
sebelum menggunakan mv
untuk menguji baris dengan file Anda.
Peningkatan kecil
Kami dapat menyematkan panggilan ke bash
ke exec , dengan ekspansi parameter (khususnya penghapusan awalan). Pada dasarnya itu menyematkan skrip ke dalam panggilan exec.
$> find "$PWD" -type f -name "results.txt" -exec bash -c ' DIR=$( dirname "{}" ); echo "{}" "$DIR"/"${DIR##*/}".txt ' ;
/home/xieerqi/TESTDIR/fred/results.txt /home/xieerqi/TESTDIR/fred/fred.txt
/home/xieerqi/TESTDIR/jane/results.txt /home/xieerqi/TESTDIR/jane/jane.txt
/home/xieerqi/TESTDIR/john/results.txt /home/xieerqi/TESTDIR/john/john.txt
Untuk membuat perintah menjadi umum, (berfungsi untuk file apa pun, bukan hanya results.txt
) hapus saja -name "results.txt"
bagian. Lihat juga posting ini untuk solusi alternatif Python untuk ini.