Znajdź -exec na sucho?

Dec 27 2020

Czy istnieje sposób, aby zobaczyć, jaki find . -exec somecommand {} \;byłby wynik a w przypadku podstawień, bez faktycznego uruchamiania poleceń? Jak przebieg próbny (lub test lub wydruk)?

Na przykład załóżmy, że mam następującą strukturę plików:

/a/1.txt
/a/2.txt
/a/b/3.txt

Czy istnieje sposób na przetestowanie find . type f -exec rm {} \;z wnętrza akatalogu, tak aby wynik był drukowany na standardowe wyjście, ale nie był wykonywany, na przykład:

rm 1.txt
rm 2.txt
rm b/3.txt

Aktualizacja Uwaga: rmto tylko przykładowe polecenie, interesuje mnie ogólny przypadek

Odpowiedzi

18 rAlen Dec 27 2020 at 07:10

Możesz biec echo rmzamiastrm

find . type f -exec echo rm {} \;

Ponadto, findma -deleteopcję, aby usunąć pliki znalezione

3 l0b0 Dec 27 2020 at 07:28

W rmszczególności nie potrzebujesz -exec: po prostu uruchom find . -type flistę i dodaj, -deleteaby usunąć pliki wymienione w poprzednim poleceniu (oczywiście z wyjątkiem tworzenia / usuwania pasujących plików w międzyczasie).

Ponadto, podobnie jak w przypadku poleceń rm, które podjąć dowolną liczbę argumentów, będziemy chcieli, aby zastąpić \;z +biec jak kilka poleceń, jak to możliwe.

2 CharlesDuffy Dec 28 2020 at 00:38

To trochę kęs, ale w przeciwieństwie do podejść wykorzystujących echo, poniższy kod wyjściowy, który można uruchomić w powłoce bez żadnych zmian, aby uzyskać poprawny wynik, nawet jeśli nazwy plików zawierają cudzysłowy, spacje, metaznaki powłoki itp.

printcmd() { printf '%q ' "$@"; printf '\n'; } find . -exec bash -c "$(declare -f printcmd); "'printcmd "$@"' _ \
  somecommand {} \;

Zwróć uwagę, że ciąg znaków, który poprzedzamy nasz -execargument, to dokładnie bash -c "$(declare -f printcmd); "'printcmd "$@"' _- interpretacja do $(declare -f printcmd)kodu funkcji; po tym faktycznie wywołujemy funkcję z argumentami $1i dalej i umieszczamy _jako symbol zastępczy dla $0.

Możesz podstawić bash zshlub kshzamiast niego, jeśli chcesz, aby dane wyjściowe były używane w tej powłoce.