Могу ли я запустить 'ls' для текстового файла, содержащего список файлов и каталогов?

stat вокруг (вы не прокомментировали версию вашей ОС )? попробуй

stat -c$'%F\n%n' * | awk '/^directory/ {getline LEFT[++DC]; next} {getline RIGHT[++FC]} END {for (i=1; i<=(DC>FC?DC:FC); i++) print LEFT[i], RIGHT[i]}' OFS="\t"
dir1    awkscript
dir2    fil1
dir3    file
dir4    file~
        file1
        file1~
        file2
0
09.02.2020, 23:43
2 ответа

cat file.txt | ls -l выведет содержимое файла на стандартный ввод из ls, он просто ничего оттуда не читает. Обычно стандартный ввод подключен к терминалу, и вы никогда ничего не вводите для ls, когда он работает. Однако он читает из командной строки, поэтому вы можете поместить туда содержимое файла с подстановкой команд:

ls -ld $(cat file.txt) | grep ^-

-dсуществует, так что lsне перечисляет содержимое каталогов.

Однако здесь есть обычные оговорки относительно разделения слов, строки с пробелами будут разбиты на несколько частей, а lsбудет, например. искать файлы с именем package, divertsи others. Кроме того, подстановочные знаки в именах файлов будут расширены. Чтобы предотвратить это, нам нужно отключить подстановку с помощью set -fи установить IFSдля разделения только на новые строки. Предполагая Баш:

(set -f; IFS=$'\n'; ls -ld $(cat file.txt) | grep ^- )

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

2
28.04.2021, 23:24

Вместо того, чтобы пытаться анализировать строку разрешений в начале вывода ls, я думаю, что сделал бы это следующим образом:

while IFS= read -r filepath; do 
  test -f "$filepath" && echo "$filepath: is an ordinary file"
done < file.txt

Вы можете использовать форму [ -f "$filepath" ]от test, если хотите.

2
28.04.2021, 23:24

Теги

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