Я пытаюсь получить содержимое каталога с помощью оболочки script.
Мой script:
for entry in `ls $search_dir`; do
echo $entry
done
где $search_dir
- относительный путь. Однако $search_dir
содержит много файлов с пробелами в именах. В этом случае этот script работает не так, как ожидалось.
Я знаю, что могу использовать for entry in *
, но это будет работать только для моего текущего каталога.
Я знаю, что могу перейти в этот каталог, используйте for entry in *
, затем измените его, но моя конкретная ситуация мешает мне это сделать.
У меня есть два относительных пути $search_dir
и $work_dir
, и я должен работать одновременно, читая их создание/удаление файлов в них и т.д.
Итак, что мне теперь делать?
PS: Я использую bash.
Ответ 1
for entry in "$search_dir"/*
do
echo "$entry"
done
Ответ 2
Другие ответы здесь замечательные и отвечают на ваш вопрос, но это лучший результат Google для "bash получить список файлов в каталоге" (который я искал для сохранения списка файлов), поэтому я подумал, что я опубликую ответ на эту проблему:
ls $search_path > filename.txt
Если вам нужен только определенный тип (например, любые .txt файлы):
ls $search_path | grep *.txt > filename.txt
Обратите внимание, что $search_path является необязательным; ls > filename.txt выполнит текущий каталог.
Ответ 3
for entry in "$search_dir"/* "$work_dir"/*
do
if [ -f "$entry" ];then
echo "$entry"
fi
done
Ответ 4
Это способ сделать это, когда синтаксис для меня проще понять:
yourfilenames=`ls ./*.txt`
for eachfile in $yourfilenames
do
echo $eachfile
done
./
- это текущий рабочий каталог, но его можно заменить любым путем
*.txt
возвращает anything.txt
Вы можете проверить, что будет легко указано, набрав команду ls
прямо в терминал.
В принципе, вы создаете переменную yourfilenames
, содержащую все, что команда list возвращает как отдельный элемент, а затем вы ее просматриваете. Цикл создает временную переменную eachfile
, которая содержит один элемент переменной, через которую он проходит, в данном случае - имя файла. Это не обязательно лучше, чем другие ответы, но я нахожу это интуитивно понятным, потому что я уже знаком с командой ls
и синтаксисом for for.
Ответ 5
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}"
Ответ 6
В версии для Linux, с которой я работаю (x86_64 GNU/Linux), работает:
for entry in "$search_dir"/*
do
echo "$entry"
done
Ответ 7
Вот еще один способ перечисления файлов внутри каталога (с использованием другого инструмента, не столь эффективного, как некоторые другие ответы).
cd "search_dir"
for [ z in 'echo *' ]; do
echo "$z"
done
echo *
Выводит все файлы текущего каталога. Цикл for
выполняет итерацию по каждому имени файла и печатает на stdout.
Кроме того, если вы ищете каталоги внутри каталога, поместите это внутри цикла for
:
if [ test -d $z ]; then
echo "$z is a directory"
fi
test -d
проверяет, является ли файл каталогом.
Ответ 8
Принятый ответ не вернет префикс файлов с. Для этого используйте
for entry in "$search_dir"/* "$search_dir"/.[!.]* "$search_dir"/..?*
do
echo "$entry"
done
Ответ 9
$ pwd; ls -l
/home/victoria/test
total 12
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:31 a
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:31 b
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:31 c
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:32 'c d'
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:31 d
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32 dir_a
drwxr-xr-x 2 victoria victoria 4096 Apr 23 11:32 dir_b
-rw-r--r-- 1 victoria victoria 0 Apr 23 11:32 'e; f'
$ find . -type f
./c
./b
./a
./d
./c d
./e; f
$ find . -type f | sed 's/^\.\///g' | sort
a
b
c
c d
d
e; f
$ find . -type f | sed 's/^\.\///g' | sort > tmp
$ cat tmp
a
b
c
c d
d
e; f
вариации
$ pwd
/home/victoria
$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2
$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2
Заметки:
-
.
: текущая папка - удалить
-maxdepth 1
для поиска рекурсивно -
-type f
: поиск файлов, а не каталогов (d
) -
-not -path '*/\.*'
: Не возвращать .hidden_files
-
sed 's/^\.\///g'
: удалите префиксированный ./
из списка результатов