Spowoduje to pominięcie plików z nazwami zaczynającymi się od kropki.
Sean,
2
Źle, w zależności od ustawień powłoki * może nie dać "ukrytych" plików / katalogów - tych, które zaczynają się od kropki (.) Spróbuj uruchomić to polecenie w swoim katalogu domowym, a następnie po prostu "znajdź -type f" i zobacz różnicę .
Ilia K.
35
Bardziej istotnym problemem jest to, że powłoka ocenia znak „*”. W rzeczywistości masz typ sytuacji wstrzyknięcia złośliwego kodu. Utworzenie pliku o nazwie „--exec rm” i innego o nazwie „zzzz;” byłoby trywialne. Żegnajcie pliki.
CWF
6
To jest niebezpieczne. Jeśli nazwa pliku zaczyna się od myślnika, będzie traktowana jako opcja do znalezienia i może się nie powieść lub może potencjalnie spowodować uszkodzenie.
Dale Anderson
4
Dlaczego jest to -printwymagane? Dało ten sam wynik bez tej flagi.
user13107
239
Znajdź tylko zwykłe pliki w bieżącym katalogu i wydrukuj je bez ./przedrostka „ ”:
find -type f -printf '%P\n'
Od znalezienia człowieka, opis -printfformatu:
% P Nazwa pliku z nazwą argumentu wiersza poleceń, pod którym została znaleziona, została usunięta.
To jest moje ulubione rozwiązanie; jest zgodny z POSIX (działa praktycznie wszędzie, nawet w systemach wbudowanych), jest bardzo krótki i jest mało prawdopodobne, aby powodował nieoczekiwane zachowanie. To powinna być akceptowana odpowiedź.
Jody Bruchon
6
Jak można to połączyć find -exec?
Paul Wintz,
find -exec sh -c "echo {} | sed 's|^\./||'" \; lub find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
Chociaż ten kod może rozwiązać problem, w tym wyjaśnienie, jak i dlaczego to rozwiązuje problem, naprawdę pomogłoby poprawić jakość twojego posta i prawdopodobnie zaowocowałoby większą liczbą pozytywnych głosów. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz. Zmień swoją odpowiedź, aby dodać wyjaśnienia i wskazać, jakie ograniczenia i założenia mają zastosowanie.
David Buck
2
Ponieważ -printfopcja nie jest dostępna na OSX, findtutaj jest jedno polecenie, które działa na OSX find, na wypadek, gdyby ktoś nie chciał zainstalować gnu findza pomocą brewitp:
Niestety powoduje to usunięcie całej ścieżki każdego znalezionego pliku, w tym podkatalogów pośrednich, i po prostu wypisuje samą nazwę pliku.
PLL
1
Masz rację. To rozwiązanie jest dobre tylko dla plików w bieżącym katalogu. W przypadku plików zagnieżdżonych musimy użyć:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
-exec /path/to/myscript.sh {}
w swoimfind
,-printf '%P\n'
nie działa. Zamiast tego muszę zrobić./
prefiks w skrypcie przez:p=${1#"./"}
f=`find . -name migration`; echo ${f/.\//}
Odpowiedzi:
Jeśli znajdują się tylko w bieżącym katalogu
find * -type f -print
Czy tego chcesz?
źródło
-print
wymagane? Dało ten sam wynik bez tej flagi.Znajdź tylko zwykłe pliki w bieżącym katalogu i wydrukuj je bez
./
przedrostka „ ”:Od znalezienia człowieka, opis
-printf
formatu:źródło
find
obsługuje-printf
(nie wszystkie).\0
zamiast,\n
jeśli chcesz toxargs -0
find -type f -printf '%P\0' | xargs -0 head
brew install findutils
;)Użyj sed
źródło
find -exec
?find -exec sh -c "echo {} | sed 's|^\./||'" \;
lubfind -exec sh -c "sed 's|^\./||' <<< '{}'" \;
może być krótszy
źródło
2> /dev/null
zignorować błąd zgłaszany, gdy polecenie jest uruchamiane w pustym katalogu.Innym sposobem na usunięcie
./
jest użyciecut
:Więcej wyjaśnień można znaleźć tutaj
źródło
Inny sposób na usunięcie ./
źródło
Ponieważ
-printf
opcja nie jest dostępna na OSX,find
tutaj jest jedno polecenie, które działa na OSX find, na wypadek, gdyby ktoś nie chciał zainstalowaćgnu find
za pomocąbrew
itp:źródło
find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +