Bash find คำสั่งเอาต์พุตแบบละเอียด


45

มีวิธีที่จะบอกfindคำสั่งbash เพื่อส่งออกสิ่งที่มันทำ (โหมด verbose)?

ตัวอย่างเช่นสำหรับคำสั่ง: find /media/1Tb/videos -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;เพื่อส่งออก:

Found /media/1Tb/videos/102, executing rm -rf /media/1Tb/videos/102
...

คำตอบ:


61

คุณสามารถปรุงอะไรซักอย่างด้วย-printfแต่สิ่งที่ง่ายที่สุดคือการตรึง-printไว้ที่ท้าย นี่จะแสดงสิ่งที่ถูกลบสำเร็จ


คำตอบนี้สามารถใช้ได้กับทุกสิ่งเมื่อใช้findดังนั้นยกนิ้วขึ้น
Alex

findความรักของฉันเพิ่มขึ้นอีกเล็กน้อย ขอบคุณ :)
Darragh Enright

8
สำหรับฉันใช้ "-exec rm -vf {} \;" ทำงานได้ดีขึ้น
djangofan

1
ดี! ทำงานร่วมกับ -delete เกินไป: find -L . -type l -delete -print
runlevel0

18

วิธีการเพียงแค่ใช้rm -vfสำหรับการส่งออก verbose rm

$ touch file1 file2 file3
$ find . -name "file?" -exec rm -vf {} \;
removed `./file2'
removed `./file3'
removed `./file1'

ตัวเลือกที่ verbose สำหรับrmเย็น แต่ถ้าฉันแทนที่มันด้วยอย่างอื่นผมไม่สามารถมองเห็นสิ่งที่ไฟล์ที่กำลังทำงานอยู่ (ยกเว้นกรณีที่ผมใช้echoภายใน-exec)
อเล็กซ์

8

อีกทางเลือกหนึ่งคือให้คำสั่งดำเนินการโดยsh -x:

$ find . -type f -print0 | xargs -0 -n1 echo rm | sh -x
+ rm ./file1
+ rm ./file2
+ rm ./file3

shell debugโหมดจะชัดเจนเพียงพอในสิ่งที่เกิดขึ้น ขอบคุณ
sdkks

1

นอกจากนี้ยังมีfind -D xxxxที่สามารถช่วยในบางกรณี

 $ find -D help
 Valid arguments for -D:
 help       Explain the various -D options
 tree       Display the expression tree
 search     Navigate the directory tree verbosely
 stat       Trace calls to stat(2) and lstat(2)
 rates      Indicate how often each predicate succeeded
 opt        Show diagnostic information relating to optimisation
 exec       Show diagnostic information relating to -exec, -execdir, -ok and -okdir

ด้านล่างเป็นตัวอย่างสองตัวอย่างfind -D search:

ใช้ RHEL 6.3 ( findv4.4):

$ mkdir -p aa/bb
$ touch aa/11 aa/22 aa/33 aa/bb/44 aa/bb/55
$ find -D search aa -type f -delete
consider_visiting: fts_info=FTS_D , fts_level= 0, prev_depth=-2147483648 fts_path=`aa', fts_accpath=`aa'
consider_visiting: fts_info=FTS_D , fts_level= 1, prev_depth=0 fts_path=`aa/bb', fts_accpath=`bb'
consider_visiting: fts_info=FTS_NSOK, fts_level= 2, prev_depth=1 fts_path=`aa/bb/55', fts_accpath=`55'
consider_visiting: fts_info=FTS_NSOK, fts_level= 2, prev_depth=2 fts_path=`aa/bb/44', fts_accpath=`44'
consider_visiting: fts_info=FTS_DP, fts_level= 1, prev_depth=2 fts_path=`aa/bb', fts_accpath=`bb'
consider_visiting: fts_info=FTS_NSOK, fts_level= 1, prev_depth=1 fts_path=`aa/22', fts_accpath=`22'
consider_visiting: fts_info=FTS_NSOK, fts_level= 1, prev_depth=1 fts_path=`aa/33', fts_accpath=`33'
consider_visiting: fts_info=FTS_NSOK, fts_level= 1, prev_depth=1 fts_path=`aa/11', fts_accpath=`11'
consider_visiting: fts_info=FTS_DP, fts_level= 0, prev_depth=1 fts_path=`aa', fts_accpath=`aa'
$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX FTS() CBO(level=0)

ใช้ Cygwin 1.7 ( find4.5):

$ mkdir -p aa/bb
$ touch aa/11 aa/22 aa/33 aa/bb/44 aa/bb/55
$ find -D search aa -type f -delete
consider_visiting (early): 'aa': fts_info=FTS_D , fts_level= 0, prev_depth=-2147483648 fts_path='aa', fts_accpath='aa'
consider_visiting (late): 'aa': fts_info=FTS_D , isdir=1 ignore=1 have_stat=1 have_type=1
consider_visiting (early): 'aa/11': fts_info=FTS_NSOK, fts_level= 1, prev_depth=0 fts_path='aa/11', fts_accpath='11'
consider_visiting (late): 'aa/11': fts_info=FTS_NSOK, isdir=0 ignore=0 have_stat=0 have_type=1
consider_visiting (early): 'aa/22': fts_info=FTS_NSOK, fts_level= 1, prev_depth=1 fts_path='aa/22', fts_accpath='22'
consider_visiting (late): 'aa/22': fts_info=FTS_NSOK, isdir=0 ignore=0 have_stat=0 have_type=1
consider_visiting (early): 'aa/33': fts_info=FTS_NSOK, fts_level= 1, prev_depth=1 fts_path='aa/33', fts_accpath='33'
consider_visiting (late): 'aa/33': fts_info=FTS_NSOK, isdir=0 ignore=0 have_stat=0 have_type=1
consider_visiting (early): 'aa/bb': fts_info=FTS_D , fts_level= 1, prev_depth=1 fts_path='aa/bb', fts_accpath='bb'
consider_visiting (late): 'aa/bb': fts_info=FTS_D , isdir=1 ignore=1 have_stat=1 have_type=1
consider_visiting (early): 'aa/bb/44': fts_info=FTS_NSOK, fts_level= 2, prev_depth=1 fts_path='aa/bb/44', fts_accpath='44'
consider_visiting (late): 'aa/bb/44': fts_info=FTS_NSOK, isdir=0 ignore=0 have_stat=0 have_type=1
consider_visiting (early): 'aa/bb/55': fts_info=FTS_NSOK, fts_level= 2, prev_depth=2 fts_path='aa/bb/55', fts_accpath='55'
consider_visiting (late): 'aa/bb/55': fts_info=FTS_NSOK, isdir=0 ignore=0 have_stat=0 have_type=1
consider_visiting (early): 'aa/bb': fts_info=FTS_DP, fts_level= 1, prev_depth=2 fts_path='aa/bb', fts_accpath='bb'
consider_visiting (late): 'aa/bb': fts_info=FTS_DP, isdir=1 ignore=0 have_stat=1 have_type=1
consider_visiting (early): 'aa': fts_info=FTS_DP, fts_level= 0, prev_depth=1 fts_path='aa', fts_accpath='aa'
consider_visiting (late): 'aa': fts_info=FTS_DP, isdir=1 ignore=0 have_stat=1 have_type=1
$ find --version
find (GNU findutils) 4.5.11
Packaged by Cygwin (4.5.11-1)
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)

1

@ คำตอบของ hlovdav นั้นเพียงพอสำหรับฉัน แต่ฉันได้ทำการดัดแปลงเพื่อการใช้งานของตัวเอง

find . -name 'application*.yml' -print0 | xargs -0 -I %% bash -c 'rm -v "$1"' -- "%%"

คำอธิบาย

  1. หา
  2. pattern
  3. พิมพ์nullแยกสำคัญถ้าคุณมีชื่อไฟล์ที่มีช่องว่างหรือตัวละครที่ผิดปกติ
  4. xargsอ่านnullแยกตั้งค่าตัวยึดแต่ละระเบียนเป็น%% นี่ยังช่วยให้มั่นใจทุกครั้งที่ใช้อาร์กิวเมนต์เดียวเท่านั้น
  5. bash คำสั่งหนึ่งซับทุกอย่างเข้าไปข้างในจะต้องยกมาเดี่ยว '
  6. --หมายถึงสิ่งที่ฉันทำหลังจากนี้ไม่ได้xargsหรือbashตัวเลือก แต่พารามิเตอร์ตำแหน่งสคริปต์หนึ่งซับของฉัน
  7. ตัวยึดตำแหน่งจะได้รับเป็นอาร์กิวเมนต์เดียวโดยการอ้างถึงเครื่องหมายคำพูดเดี่ยวหรือคู่ไม่สำคัญ หากคุณใช้เครื่องหมายคำพูดคู่คุณสามารถแทรกตัวแปรเชลล์ได้เช่นกัน
  8. ภายในbashสคริปต์คุณสามารถเข้าถึง%%เป็น$1อาร์กิวเมนต์ตำแหน่งที่ # 1

หมายเหตุ: คุณสามารถเปลี่ยนแปลงได้%%ด้วยอะไรก็ได้เพียงตรวจสอบให้แน่ใจว่าคุณไม่จำเป็นต้องใช้มันเพื่อสิ่งอื่นนอกจากตัวยึดตำแหน่ง การใช้เงินดอลลาร์$หรือ@อาจจะไม่ดีเว้นแต่จะเป็นคู่เหมือน@@@

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.