Bash znajdź pełne polecenie

46

Czy istnieje sposób na findpolecenie bash, aby wypisał, co robi (tryb pełny)?

Na przykład dla polecenia: find /media/1Tb/videos -maxdepth 1 -type d -mtime +7 -exec rm -rf {} \;to output:

Found /media/1Tb/videos/102, executing rm -rf /media/1Tb/videos/102
...
Alex
źródło

Odpowiedzi:

62

Można coś wymyślić -printf, ale najłatwiej jest po prostu sfałszować na -printkońcu. Pokaże to, co zostało pomyślnie usunięte.

Ignacio Vazquez-Abrams
źródło
ta odpowiedź może być zastosowana do wszystkiego podczas używania find, więc kciuki w górę
Alex
moja findmiłość urosła jeszcze raz. dzięki :)
Darragh Enright
8
Dla mnie użycie „-exec rm -vf {} \;” działał lepiej.
djangofan
1
Miły! Działa również z -delete: find -L . -type l -delete -print
runlevel0
19

A może po prostu użyjesz rm -vfpełnego wyjścia rm.

$ touch file1 file2 file3
$ find . -name "file?" -exec rm -vf {} \;
removed `./file2'
removed `./file3'
removed `./file1'
HampusLi
źródło
pełna opcja dla rmjest fajna, ale jeśli zastąpię ją czymś innym, nie będę już widzieć, nad którymi pracują pliki (chyba, że ​​użyję echowewnątrz -exec)
Alex
8

Alternatywą jest umożliwienie wykonywania poleceń przez sh -x:

$ find . -type f -print0 | xargs -0 -n1 echo rm | sh -x
+ rm ./file1
+ rm ./file2
+ rm ./file3
hlovdal
źródło
shell debugtryb będzie wystarczająco jasny na temat tego, co się stało. Dzięki
sdkks
1

W find -D xxxxniektórych przypadkach może to również pomóc.

 $ 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

Poniżej znajdują się dwa przykłady find -D search:

Przy użyciu 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)

Korzystanie z 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)
olibre
źródło
1

@ hlovdav za odpowiedź była dla mnie za mało, ale zrobiłem pewne modyfikacje na własny użytek

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

Wyjaśnienie

  1. odnaleźć
  2. pattern
  3. Drukuj nullosobno, ważne, jeśli masz nazwy plików ze spacjami lub nietypowymi znakami
  4. xargsCzytaj nulloddzielnie, ustaw każdy symbol zastępczy rekordu na %% To zapewnia również za każdym razem, gdy używa tylko jednego argumentu
  5. bash polecenie, jednowierszowe, wszystko, co wchodzi do środka, musi być cytowane '
  6. --czyli coś zrobić po tym nie ma xargsani bashmożliwości, ale parametry pozycyjne do mojego skryptu jedno-liner
  7. Cytat zastępczy jest podawany jako pojedynczy argument, pojedynczy lub podwójny cudzysłów nie ma znaczenia. Jeśli używasz podwójnych cudzysłowów, możesz także wstawiać zmienne powłoki.
  8. Wewnątrz bashskryptu można uzyskać dostęp %%jako $1argument pozycyjny nr 1

Uwaga: możesz zmienić %%wszystko, tylko upewnij się, że nie musisz go używać do niczego innego niż symbol zastępczy. Korzystanie dolara $lub @może nie być dobra, chyba że jest to podwójnie @jak @@.

sdkks
źródło