Znajdź -exec na sucho?
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
Możesz biec echo rmzamiastrm
find . type f -exec echo rm {} \;
Ponadto, findma -deleteopcję, aby usunąć pliki znalezione
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.
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.