Як ls без рекурсивного


19

Я намагаюся знайти деякі файли з візерунком у каталозі. Я хочу лише сканувати перший рівень не рекурсивно.

Мій сценарій:

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

Вище сканування команди рекурсивно. Як зробити це лише для сканування каталогу першого рівня?


printf %s\\n "$INCOMINGDIR/"*"$BUSINESSDATE"*
mikeserv

Відповіді:


39

Не розбирайтеls . Також не використовуйте ALL_CAPS_VARS

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

В інтерактивному режимі lsє -dпараметр, який запобігає попаданню в підкаталоги:

ls -d $INCOMINGDIR/*$BUSSINESSDATE*

Дякую за інформацію, я зараз почну створювати файли з новими рядками в імені, щоб зараз тільки дратувати системних адміністраторів.
Пета

Ось чому розумний sysadmin / програміст використовує "${i}". Ніколи не знаєш, що може бути i.
Рікі Бім

@Petah: або хтось із поганими намірами може створити файл з ім'ям my_file.doc[newline]another_persons_file.docі сподіватися, що деякі сценарії можуть спробувати "rm" те, що він вважає двома іменами ... Посилання Glenn обов'язково читається (на mywiki.wooledge.org, кожен повинен прочитати весь фак, а також сторінка підводних каменів)
Олів'є Дулак

1
круто. я не знав -d варіант!
докаспар

Чудово! Це працює і для більш простих речей. Такі, як список усіх файлів з префіксом:ls -d .*
Wassadamo

8

Немає причин, чому ця команда повинна бути рекурсивною. Але якщо $INCOMINGDIR/*$BUSSINESSDATE*відповідає каталогу, то вміст цього каталогу відображається замість самого каталогу. Але не було б рекурсії поза цим рівнем.

Використовуйте цю команду, щоб уникнути цього ефекту:

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

for ... inкоманди з lsвиведенням ризиковані.

Загалом, findздається, краще рішення або

for i in "$INCOMINGDIR/"*"$BUSSINESSDATE"*
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.