2016-09-13 10 views
-1

Я хочу получить все файлы в каталоге, но не в любых подкаталогах в этом каталоге. Пока я использую;Получить файлы в каталоге, но не подкаталог

file=(path/to/my/files/*) 

for f in ${files[@]}; do ... 
+1

Вы пытались использовать 'find'? – Inian

+1

Может быть, в какой-то день 'bash' получит классификаторы glob' zsh': 'files = (путь/to/my/files/* (.))'. – chepner

ответ

1

Надлежащих безошибочный способ делать он использует GNU найти что-то вроде

#!/bin/bash 

while IFS= read -r -d '' file; do 

    # Your script/command(s) goes here 

done < <(find . -maxdepth 1 -mindepth 1 -type f -print0) 

man find говорит следующее о -mindepth и -maxdepth полей

-maxdepth levels 
      Descend at most levels (a non-negative integer) levels of directories below the command line arguments. -maxdepth 0 
      means only apply the tests and actions to the command line arguments. 

-mindepth levels 
      Do not apply any tests or actions at levels less than levels (a non-negative integer). -mindepth 1 means process all files except the command line arguments. 

Так в идеале -mindepth 1 и -maxdepth 1 не будет выходить за рамки поиска файлов на более чем одном уровне т.е. предельному в текущем каталоге. Флаг -print0 выполняет обработку файлов со специальными символами.

2

Пропустить подкаталоги внутри цикла:

for file in path/to/my/files/*; do 
    [[ -d $file ]] && continue 
    # do other stuff here 
done 

Это не удивительно эффективное, но вы можете создать массив файлов, как это:

files=() 
for file in path/to/my/files/*; do 
    [[ -d $file ]] || files+=("$file") 
done 
0

Сделайте свою домашнюю работу, прежде чем спрашивать :)

Если вы хотите получить только файлы, это так же просто, как:

find <directory_name> -maxdepth 1 -type f 

Если вы хотите, чтобы получить каталоги в директории (только 1 уровень:

find <directory_name> -maxdepth 1 -type d 

вы получите точку

в Баш скрипт (спасибо @chepner для его примечания):

#!/bin/bash 

find . -maxdepth 1 -type f -print0 | while IFS= read -r -d '' file; do 
    echo "$file" 
done 
+0

... и как получить результаты поиска в переменной, которую я могу задать? – myol

+0

Легко: '#!/Bin/bash my_files =' find. -maxdepth 1-type f' для файла в $ my_files; do echo $ file сделано ' – sestus

+0

Я добавил ответ на оригинальный ответ для вашего удобства – sestus

Смежные вопросы