Я пытаюсь получить содержимое каталога с помощью сценария оболочки.
Мой сценарий:
for entry in `ls $search_dir`; do
echo $entry
done
где $search_dir
относительный путь. Тем не менее, $search_dir
содержит много файлов с пробелами в их именах. В этом случае этот сценарий не выполняется должным образом.
Я знаю, что могу использовать for entry in *
, но это будет работать только для моего текущего каталога.
Я знаю, что могу перейти в этот каталог, использовать и for entry in *
затем вернуться обратно, но моя конкретная ситуация не позволяет мне сделать это.
У меня есть два относительных пути $search_dir
и $work_dir
, и я должен работать над обоими одновременно, читая их, создавая / удаляя файлы в них и т. Д.
Так что мне теперь делать?
PS: я использую bash.
bash
shell
directory-listing
jrharshath
источник
источник
for entry in "$search_dir/*"
не работают? Почему мы должны размещать/*
вне кавычек?find
будет быстрее?for entry in "${search_dir}/*"
Другие ответы здесь великолепны и отвечают на ваш вопрос, но это лучший результат Google для "bash get list of files in directory" (который я искал, чтобы сохранить список файлов), поэтому я решил опубликовать ответ на эту проблему:
Если вам нужен только определенный тип (например, любые файлы .txt):
Обратите внимание, что $ search_path является необязательным; ls> filename.txt сделает текущий каталог.
источник
ls
для разбора имен файлов? Не слышал об этом раньше.Это способ сделать это там, где синтаксис для меня проще понять:
./
является текущим рабочим каталогом, но может быть заменен любым путем и*.txt
возвращает что угодно.Вы можете легко проверить, что будет в списке, введя
ls
команду прямо в терминал.По сути, вы создаете переменную,
yourfilenames
содержащую все, что команда list возвращает как отдельный элемент, а затем вы проходите через нее. Цикл создает временную переменную,eachfile
которая содержит единственный элемент переменной, через которую она проходит, в данном случае это имя файла. Это не обязательно лучше, чем другие ответы, но я нахожу это интуитивно понятным, потому что я уже знаком сls
командой и синтаксисом цикла for.источник
A
,B
иC
. Вы создаете файлы с именемB\nC
andD
, а затем выбираете их удаление. Программное обеспечение, которое не обрабатывает это право, может в итоге удалить ранее существующие файлы B и C, даже если у вас их не было. разрешение на это.)источник
источник
xargs -0 -i echo "{}"
команду, не хочешь объяснить мне немного? В частности, что-i echo "{}"
часть делает? Также я прочитал соman
страницы, которая-i
устарела сейчас, и мы должны использовать-I
insted.-i
заменяет{}
арг.{}
это строка, которая заменяется на совпаденияfind
командой.xargs
? по умолчаниюfind
печатает то, что находит ... вы можете удалить все-print0
.вариации
Ноты:
.
: текущая папка-maxdepth 1
для поиска рекурсивно-type f
: найти файлы, а не каталоги (d
)-not -path '*/\.*'
: не вернуть.hidden_files
sed 's/^\.\///g'
: удалить предварительно добавленный./
из списка результатовисточник
Вот еще один способ перечисления файлов внутри каталога (с использованием другого инструмента, не столь эффективного, как некоторые другие ответы).
echo *
Выводит все файлы текущего каталога.for
Цикл перебирает каждое имя файла и выводит на стандартный вывод.Кроме того, если вы ищете каталоги внутри каталога, поместите это в
for
цикл:test -d
проверяет, является ли файл каталогом.источник
Принятый ответ не вернет префикс файлов с. Для этого используйте
источник
В версии для Linux, с которой я работаю (x86_64 GNU / Linux), выполняются следующие работы:
источник
$search_dir
означает, что он разрывается, если в имени каталога есть пробел. (В этом случае вы можете избежать цитирования$entry
, но было бы лучше процитировать его.)mkdir "x y"; touch "x y/1.txt"; search_dir="x y"; for entry in $search_dir/*; do echo $entry; done
. Цикл выполняется дважды, один раз при печатиx
и во второй разy/*
, что, по-видимому, не является ожидаемым результатом.search_dir="x y"; for entry in $search_dir/*; do if [ -d "$entry" ]; then rm -rf "$entry"; fi; done
. Еслиx
в текущем каталоге также есть каталог, он будет удален, просто потому, что вы не указали свою переменную в кавычках!Просто введите эту простую команду:
источник