Potrzebuję skryptu, aby zrobić coś z każdym plikiem w bieżącym katalogu, z wyłączeniem podkatalogów.
Na przykład w bieżącej ścieżce znajduje się 5 plików, ale 1 z nich to folder (podkatalog). Mój skrypt powinien aktywować polecenie podane jako argumenty podczas uruchamiania tego skryptu. To znaczy „skrypt bash wc -w” powinien podawać liczbę słów dla każdego pliku w bieżącym katalogu, ale nie dla żadnego z folderów, aby dane wyjściowe nigdy nie zawierały żadnych wierszy „/ sub / dir: Is a directory”.
Mój obecny skrypt:
#!/bin/bash
dir=`pwd`
for file in $dir/*
do
$* $file
done
Muszę tylko wykluczyć katalogi dla pętli, ale nie wiem jak.
if [ -f "$file" ]; then ...
. Żaden katalog nie zwróciłby nie tylko zwykłych plików, ale także gniazd i dowiązań symbolicznych.! -d
już uwzględnione.Oto alternatywa dla użycia pętli for, jeśli to, co musisz zrobić, jest proste (i nie wymaga ustawiania zmiennych w głównej powłoce & c).
Można korzystać
find
ze-exec
i używać-maxdepth 1
, aby uniknąć recursing do podkatalogu.Ma
[ -n "$1" ]
to na celu uniknięcie wykonywania wszystkich plików w katalogu, gdy skrypt nie przekaże żadnych argumentów.źródło
W zsh możesz używać kwalifikatorów glob, aby ograniczyć dopasowanie symboli wieloznacznych według typu pliku. Na przykład dodanie
(.)
po wzorze ogranicza go do zwykłych plików.Aby poradzić sobie z nazwami plików rozpoczynającymi się od
-
lub.
, użyjwc -c -- *(.N)
lubwc -c ./*(.N)
. Jeśli chcesz dołączyć również dowiązania symboliczne do zwykłych plików, zrób to*(-.)
.Inne popularne powłoki nie mają takiej funkcji, więc musisz użyć innego mechanizmu do filtrowania według plików, takiego jak testowanie typów plików w pętli lub
find
.źródło
Bash dla pętli z wyłączeniem podkatalogów ('/') i linków (@):
źródło