Próbuję uzyskać zawartość katalogu za pomocą skryptu powłoki.
Mój skrypt to:
for entry in `ls $search_dir`; do
echo $entry
done
gdzie $search_dir
jest ścieżka względna. Jednak $search_dir
zawiera wiele plików ze spacjami w nazwach. W takim przypadku ten skrypt nie działa zgodnie z oczekiwaniami.
Wiem, że mógłbym użyć for entry in *
, ale to działałoby tylko w moim bieżącym katalogu.
Wiem, że mogę przejść do tego katalogu, użyć go, for entry in *
a następnie zmienić z powrotem, ale moja szczególna sytuacja uniemożliwia mi to.
Mam dwóch ścieżek względnych $search_dir
i $work_dir
, a ja mam do pracy na obu jednocześnie, czytając im tworzenie / usuwanie plików w nich itd.
Więc co mam teraz zrobić?
PS: używam basha.
bash
shell
directory-listing
jrharshath
źródło
źródło
for entry in "$search_dir/*"
nie działa? Dlaczego musimy umieszczać/*
poza cudzysłowami?find
byłby szybszy?for entry in "${search_dir}/*"
Inne odpowiedzi tutaj są świetne i odpowiadają na twoje pytanie, ale to jest najlepszy wynik Google dla „bash pobierz listę plików w katalogu” (którego szukałem, aby zapisać listę plików), więc pomyślałem, że opublikuję odpowiedź na ten problem:
Jeśli chcesz tylko określonego typu (np. Dowolne pliki .txt):
Zauważ, że $ search_path jest opcjonalne; ls> nazwa_pliku.txt zrobi bieżący katalog.
źródło
ls
do analizowania nazw plików? Nie słyszałem o tym wcześniej.Jest to sposób na zrobienie tego, w którym składnia jest dla mnie łatwiejsza do zrozumienia:
./
jest bieżącym katalogiem roboczym, ale można go zastąpić dowolną ścieżką*.txt
zwraca cokolwiek.txtMożesz łatwo sprawdzić, co zostanie wyświetlone, wpisując
ls
polecenie bezpośrednio w terminalu.Zasadniczo tworzysz zmienną
yourfilenames
zawierającą wszystko, co polecenie list zwraca jako oddzielny element, a następnie przechodzisz przez nią w pętli. Pętla tworzy zmienną tymczasową,eachfile
która zawiera pojedynczy element zmiennej, przez którą przechodzi, w tym przypadku nazwę pliku. Niekoniecznie jest to lepsze niż inne odpowiedzi, ale uważam to za intuicyjne, ponieważ znam jużls
polecenie i składnię pętli for.źródło
A
,B
iC
. Tworzysz pliki o nazwieB\nC
iD
, a następnie wybierasz ich usunięcie. Oprogramowanie, które nie obsługuje tego prawa, może zamiast tego usunąć istniejące wcześniej pliki B i C, nawet jeśli nie masz pozwolenie.)źródło
źródło
xargs -0 -i echo "{}"
polecenia, czy możesz mi trochę wyjaśnić? W szczególności, co robi ta-i echo "{}"
część? Czytałem również zeman
strony, która-i
jest teraz przestarzała i powinniśmy użyć-I
insted.-i
zastępuje{}
arg.{}
jest to ciąg, który jest zastępowany dopasowaniami przezfind
polecenie.xargs
? domyślniefind
drukuje to, co znajdzie ... możesz usunąć wszystko z-print0
.Wariacje
Uwagi:
.
: bieżący folder-maxdepth 1
aby wyszukiwać rekurencyjnie-type f
: znajdź pliki, a nie katalogi (d
)-not -path '*/\.*'
: nie wracaj.hidden_files
sed 's/^\.\///g'
: usuń przedrostek./
z listy wynikówźródło
Oto inny sposób wyświetlania plików w katalogu (przy użyciu innego narzędzia, nie tak wydajnego, jak niektóre inne odpowiedzi).
echo *
Wyprowadza wszystkie pliki z bieżącego katalogu.for
Pętla iteracje nad każdą nazwę pliku i wydruki na standardowe wyjście.Dodatkowo, jeśli szukasz katalogów w katalogu, umieść to w
for
pętli:test -d
sprawdza, czy plik jest katalogiem.źródło
Zaakceptowana odpowiedź nie zwróci przedrostka plików z rozszerzeniem. Aby to zrobić, użyj
źródło
W wersji Linux, z którą pracuję (x86_64 GNU / Linux), działa:
źródło
$search_dir
oznacza, że nie działa, jeśli w nazwie katalogu jest spacja. (W tym przypadku możesz uniknąć cytowania$entry
, ale lepiej byłoby to zacytować.)mkdir "x y"; touch "x y/1.txt"; search_dir="x y"; for entry in $search_dir/*; do echo $entry; done
. Pętla działa dwukrotnie, raz drukujex
i drugi razy/*
, co prawdopodobnie nie jest oczekiwanym wynikiem.search_dir="x y"; for entry in $search_dir/*; do if [ -d "$entry" ]; then rm -rf "$entry"; fi; done
. Jeślix
w bieżącym katalogu znajduje się również katalog, jest on usuwany tylko dlatego, że nie zacytowałeś swojej zmiennej!Wystarczy wpisać to proste polecenie:
źródło