Jak ls bez rekurencji

19

Próbuję ls jakieś pliki ze wzorem w katalogu. Chcę tylko zeskanować pierwszy poziom, a nie rekurencyjny.

Mój skrypt:

for i in $(ls $INCOMINGDIR/*$BUSSINESSDATE*)
do
  echo $i;
done

Powyższe polecenie skanuje rekurencyjnie. Jak to zrobić, aby skanować tylko katalog pierwszego poziomu?

Sas
źródło
printf %s\\n "$INCOMINGDIR/"*"$BUSINESSDATE"*
mikeserv

Odpowiedzi:

39

Nie parsujls . Również nie używać ALL_CAPS_VARS

for i in "$incoming_dir"/*"$business_date"*; do

Interaktywnie lsma -dopcję, która uniemożliwia zejście do podkatalogów:

ls -d $INCOMINGDIR/*$BUSSINESSDATE*
Glenn Jackman
źródło
Dzięki za informacje, zamierzam teraz tworzyć pliki z nowymi wierszami w nazwie, aby zirytować teraz sysadmins.
Petah
Właśnie dlatego używa inteligentnego sysadmin / programisty "${i}". Nigdy nie wiesz, co może być i.
Ricky Beam
@Petah: lub ktoś o złych zamiarach mógłby utworzyć plik o nazwie my_file.doc[newline]another_persons_file.doci mieć nadzieję, że niektóre skrypty mogą spróbować „rm”, co uważa za 2 nazwy plików ... Link Glenna jest koniecznością do przeczytania (na mywiki.wooledge.org każdy powinien przeczytać cała FAQ, a także strona pułapek)
Olivier Dulac
1
chłodny. nie znałem opcji -d!
dokaspar
Świetny! Działa to również w przypadku prostszych rzeczy. Takich jak lista wszystkich plików z kropką:ls -d .*
Wassadamo,
8

Nie ma powodu, dla którego to polecenie powinno być rekurencyjne. Ale jeśli $INCOMINGDIR/*$BUSSINESSDATE*pasuje do katalogu, wówczas zawartość tego katalogu jest wyświetlana zamiast samego katalogu. Ale nie byłoby rekurencji poza tym poziomem.

Użyj tego polecenia, aby uniknąć tego efektu:

ls -d "$INCOMINGDIR/"*"$BUSSINESSDATE"*

for ... inpolecenia z lswyjściem są ryzykowne.

Ogólnie findwydaje się lepsze rozwiązanie lub

for i in "$INCOMINGDIR/"*"$BUSSINESSDATE"*
Hauke ​​Laging
źródło