GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan nama dasar dan path lengkap di find -exec

coba sesuatu seperti ini :

find  /home/mine -iname "*.png" -printf "%P\n " | xargs  -I % -n1 cp %  /home/mine/pngcoppies/copy% 

Untuk melihat apa yang terjadi saat Anda menjalankan pencarian, cukup ketik set -xv
-x :Mencetak perintah dan argumennya saat dijalankan.
-v :Mencetak baris input shell saat dibaca.

Inilah yang saya miliki :

find . -name "*.xml" -exec echo {} \;

Memberikan output:

./log.xml
./svnLog.xml

Dan ketika saya mencoba :

set -xv
find . -name "*.xml" -exec echo {} \;

Saya mendapatkan :

find . -name "*.xml" -exec echo {} \;
+ find . -name '*.xml' -exec echo '{}' ';'
./log.xml
./svnLog.xml

Dan kemudian temukan jalankan gema dengan meneruskan nama file yang ditemukan alih-alih literal :'{}'

tetapi ketika Anda menambahkan sesuatu ke {} seperti di bawah ini :

find . -name "*.xml" -exec echo something{} \;
+ find . -name '*.xml' -exec echo 'something{}' ';'
something{}
something{}

Di sini gema dijalankan dua kali untuk 2 file xml yang saya miliki dan karena tidak ada lagi '{}' adalah daftar parameter exec, itu tidak akan diganti. jadi kami mendapatkan echo 'something{}' untuk setiap file yang ditemukan.

Untuk mengatasinya, Anda dapat berpikir untuk mengeksekusi gema yang meneruskan nama file sebagai parameter seperti misalnya :

sh -xvc 'echo sothing/$0' filename

Kita sudah tahu apa itu -x dan -v . -c adalah untuk mendapatkan perintah dari string setelahnya (man sh )

jadi hasilnya adalah :

sh -xvc 'echo somthing/$0' filename
+ sh -xvc 'echo somthing/$0' filename
echo somthing/$0
+ echo somthing/filename
sothing/filename

Saya menggunakan 'echo somthing/$0 ' antara ' ' sehingga $0 tidak diperluas oleh Shell saat ini. coba dengan " " dan Anda akan melihat perluasan $0;)

Jadi untuk kembali ke 'masalah' Anda, pencarian harus diformat seperti di bawah ini:

find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;

Dan kita akan mendapatkan :

find . -name "*.xml" -exec sh -xvc 'echo sothing/$0' {} \;
+ find . -name '*.xml' -exec sh -xvc 'echo sothing/$0' '{}' ';'
echo sothing/$0
+ echo sothing/./log.xml
sothing/./log.xml
echo sothing/$0
+ echo sothing/./svnLog.xml
sothing/./svnLog.xml

Seperti yang bisa kita lihat, find akan mengeksekusi shell cammand echo sothing/$0 meneruskannya ke '{}' (diganti dengan nama file yang ditemukan oleh find) sehingga kita mendapatkan echo sothing/./log.xml yang diinginkan

set +xv untuk menghapus mode verbose dan kita bisa mendapatkan :

find . -name "*.xml" -exec sh -c 'echo "cp $0 someWhereElse/$0"' {} \;
cp ./log.xml someWhereElse/./log.xml
cp ./svnLog.xml someWhereElse/./svnLog.xml

jadi dalam kasus Anda, Anda hanya perlu menjalankan salinan di sub Shell (tambahkan sh atau bash atau shell favorit Anda setelah exec) dan biarkan find berikan nama file sebagai pembatas ke it;)

find /home/mine -iname "*.png" -exec sh -c 'cp $0 /home/mine/pngcoppies/copy/$0' {} \;

Semoga ini bisa membantu, dan maafkan saya untuk bahasa Inggris saya.


Dari man find:"The -execdir primary identik dengan -exec primary dengan pengecualian bahwa utilitas akan dieksekusi dari direktori yang menyimpan file saat ini. Nama file yang diganti dengan string ``{}'' tidak memenuhi syarat."

find /home/mine -iname "*.png" -execdir cp {} /home/mine/pngcoppies/copy{} \;

Linux
  1. temukan dan salin file menggunakan Bash

  2. Menggunakan grep dan sed untuk mencari dan mengganti string

  3. temukan dan hapus file dengan ruang menggunakan perintah find di Linux

  1. bagaimana menemukan jalur HADOOP_HOME di Linux?

  2. Menghapus file dengan rm menggunakan find dan xargs

  3. Menggunakan find dan tar dengan file dengan karakter khusus pada namanya

  1. Sistem file apa yang digunakan saat menggunakan Windows dan Linux?

  2. Bagaimana saya bisa mencari file dengan nama dan jalur parsialnya?

  3. Pengikatan kunci yang efisien menggunakan Mac dan Linux