Как фильтровать список файлов с теми, которые существуют?Отфильтровать список файлов для существующих
Например,
echo 'a.txt
does/not.exist
b.txt' | <???>
напечатает
a.txt
b.txt
Как фильтровать список файлов с теми, которые существуют?Отфильтровать список файлов для существующих
Например,
echo 'a.txt
does/not.exist
b.txt' | <???>
напечатает
a.txt
b.txt
Вы можете ls -d
файлы и посмотреть, какие из них получить выход. Поскольку у вас есть строки в строке, просто соберите список и используйте xargs
, чтобы иметь возможность ls
.
Чтобы скрыть ошибки, перенаправьте их на /dev/null
. Все вместе, xargs ls -d 2>/dev/null
делает это:
$ echo 'a.txt
b.txt
other' | xargs ls -d 2>/dev/null
a.txt
b.txt
Как вы видите, xargs ls -d
выполняет ls -d
всем аргументами. 2>/dev/null
избавляется от сообщений stderr.
Первое, что я придумал, используйте код выхода stats
«s в то время чтения цикла:
<input> | while IFS= read -r f; do stat "$f" &>/dev/null && echo "$f"; done
Обратите внимание, что это решение является медленно, потому что петли в коде оболочки, и называет внешняя утилита (создает дочерний процесс, stat
) на каждой итерации.
Ваше желание - моя команда. – mklement0
Если у вас есть GNUxargs
, используйте -d '\n'
, чтобы гарантировать, что имена файлов со встроенными пробелами обрабатываются корректно.
$ echo 'a.txt
does/not.exist
b.txt' | xargs -d '\n' find 2>/dev/null
С BSD/MacOS xargs
, это немного сложнее:
echo 'a.txt
does/not.exist
b.txt' | tr '\n' '\0' | xargs -0 find 2>/dev/null
Я хотел бы использовать Баш, если для проверки файлов. Он заканчивается чуть менее компактным, но я думаю, что читать его проще и легче сделать что-то с каждым найденным файлом в результатах.
Он совместим с именами файлов с пробелами.
echo 'a.txt
does/not.exist
b.txt' | while read filename
do
if [[ -f "$filename" ]]
then
echo $filename # Or do something else with the files here
fi
done
... с обычными оговорками о разборе 'ls' output; например, если один из аргументов является каталогом, вы получите содержимое каталога, а не его имя. – tripleee
Хорошо, может быть, 'ls -d' было бы лучше. – fedorqui