как перечислить файлы от определенные каталоги

У меня есть список каталогов в текстовом файле, может любой говорить мне, как перечислить файлы только в каталогах, который находится в текстовом файле

-1
задан 11 February 2018 в 22:34

4 ответа

Можно использовать find и bash Замена команды на это:

find $(</path/to/path_file) -type f

Это просто перечисляет каждый file, содержавшийся в каждом каталоге, упомянутом в /path/to/path_file. Конечно, можно настроить findвывод далее, например, путем добавления -ls опция.

Пример выполняется

$ tree
.
├── path_file
├── test1
│  ├── 1
│  └── 2
└── test2
    ├── 3
    └── 4
$ cat path_file
/path/to/test1
/path/to/test2
$ find $(</path/to/path_file) -type f
/path/to/test1/2
/path/to/test1/1
/path/to/test2/4
/path/to/test2/3

Я использую полные пути здесь, таким образом, это не важно в который каталог find назван. Если path_file содержит относительные пути, которые необходимо назвать, это в корректном каталоге – воображает каждый /path/to замененный . в вышеупомянутом примере.

Если Ваши пути содержат пробелы, можно установить Внутреннего Разделителя полей на новую строку с IFS=$'\n' перед вызовом find, этот путь только новая строка будет рассматриваться как граница между путями.


Если Вы хотите пробежаться через каждую строку, я настоятельно рекомендую parallel, остаться с find:

parallel find {} -type f :::: /path/to/path_file

parallel пробелы дескрипторов в аргументах правильно дизайном.

3
ответ дан 31 October 2019 в 01:02

Здесь существует две проблемы: каждый очень прост - список файлов в каталогах и другом, который может быть немного более неприятным - чтение файла линию за линией и передающих строк из того файла как аргументы.

Классический способ сделать так через while IFS= read -r цикл и мы можем добавить другой материал к нему

while IFS= read -r line || [ -n "$line" ] ; 
do 
    [ "x$line" = "x" ] && continue
    [ -d "./$line" ] && ls "./$line"
done < ./dirs.txt

Существуют вещи пары, происходящие:

  • IFS= read -r line часть считает строку, не выполняя разделение слова; это означает это, если Вы имеете <space><space>directory_name это будет считано точно как этот, вместо directory_name только.
  • ./ рядом с проверками на то, существует ли упомянутый каталог во-первых и ls - это должно защитить от имен файлов, которые могут начаться -. Имена файлов такой как -directory может быть неправильно истолкован командами как -d флаг с соответствующим значением irectory для того флага; конечно, это приведет к ошибке, если такой флаг не будет существовать для команды.
  • [ "x$line" = "x" ] && continue проверит на пустую переменную/пустую строку. Если переменная пуста, ls произведет содержание для ./, который является неправильным поведением.

Рекурсивный случай того же самого мог быть любой через find поскольку десерт показывает, или через globstar:

shopt -s globstar
while IFS= read -r line || [ -n "$line" ] ; do 
    [ "x$line" = "x" ] && continue
    [ -d "$line" ] &&
    for i in "$line"/** ; do 
        ls "$i"
    done
done < "/path/to/dirs.txt"
2
ответ дан 31 October 2019 в 01:02

Это - простой пример, чтобы сделать это из командной строки:

ls `cat ./dirs.txt`

Замените "dirs.txt" названием файла, который содержит список Ваших каталогов. dirs.txt файл должен быть в текущем рабочем каталоге, если Вы не указываете путь к dirs.txt Перечислять файлы один экран за один раз:

ls `cat ./dirs.txt` | more

Это будет более сложно, Как Sergiy Kolodyazhnyy указал в комментариях, это не будет работать правильно если Ваш dirs.txt содержит каталог, имеет пространство в нем или вкладки.

0
ответ дан 31 October 2019 в 01:02

Я точно не знаю сценарий, но объединение одного из них внутри a for цикл в сценарии сделает то, что Вы хотите сделать.

Перечислять files only inside a directory , можно сделать один из них

Используя ls

$ ls -p | grep -v / 

OR

$ ls -al | grep '^-'

Используя находку

$ find . -maxdepth 1 -type f
-1
ответ дан 31 October 2019 в 01:02

Другие вопросы по тегам:

Похожие вопросы: