Korzystam z systemu Mac OSX i próbuję użyć wiersza polecenia, aby znaleźć liczbę plików o tej samej nazwie.
Próbowałem użyć następującego polecenia:
find ~ -type f -name "*" -print | basename | sort | uniq -d > duplicate_files
To nie działa! Kiedy wykonam następujące czynności:
find ~ -type f -name "*" -print > duplicate_files
Następnie duplicate_files zawiera ścieżki wszystkich moich plików. Myślę więc, że problem dotyczy basename
- nie akceptuje standardowych danych wejściowych. Następnie spróbowałem:
basename $(find ~ -type f -name "*" -print) > duplicate_files
ale znowu to nie działa. Wyszukiwanie w Internecie nie sprawia wiele radości. Wszelkie myśli są mile widziane.
Dlaczego nie użyć wbudowanych
find
funkcji, aby wyprowadzić tylko nazwę pliku:(zakłada GNU
find
) lub przynajmniej coś takiego:basename
nie można czytać za pomocą potoku ani przetwarzać wielu plików jednocześnie.ps. Nie ma potrzeby określania,
-name '*'
czy chcesz wyświetlić listę wszystkich plików. To jest opcja domyślna.źródło
basename: unknown primary or operator
. Dzięki za wskazówkę-name "*"
-printf
nawet na stronie man posix. Jeśli chodzi o błąd z drugą drogą, w mojej odpowiedzi jest to literówka. Naprawiony. Czy możesz spróbować jeszcze raz?-printf
dostaję-printf: unknown primary or operator
. Również, gdy sprawdziłem Uniksa w książce Nutshell, wymieniono go jako opcję GNU / Linux - nie mówi nic o OSXman find
w twojej konsoli :)Wygląda na to, że działa na mnie w OSX:
źródło
+
oznacza polecenie?-a
opcję pokrycia tej sprawy.Alternatywy (zakłada brak nowej linii w nazwach plików):
źródło
Możesz użyć za
xargs
pomocą,basename
aby uzyskać pożądane dane wyjściowe, takie jak:źródło
W najnowszej wersji
bash
tej obsługi tablic asocjacyjnych następujące czynności dodatkowo obsługiwałyby ścieżki z osadzonymi znakami nowej linii:To nie używa zewnętrznego narzędzia.
źródło