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
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 ^- )
Альтернативой может быть циклическое перебор содержимого файла в оболочке и проверка, представляют ли строки имена каталогов или нет.
Вместо того, чтобы пытаться анализировать строку разрешений в начале вывода ls
, я думаю, что сделал бы это следующим образом:
while IFS= read -r filepath; do
test -f "$filepath" && echo "$filepath: is an ordinary file"
done < file.txt
Вы можете использовать форму [ -f "$filepath" ]
от test
, если хотите.