2014-01-14 3 views

ответ

12

Вы можете 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.

+2

... с обычными оговорками о разборе 'ls' output; например, если один из аргументов является каталогом, вы получите содержимое каталога, а не его имя. – tripleee

+2

Хорошо, может быть, 'ls -d' было бы лучше. – fedorqui

0

Первое, что я придумал, используйте код выхода stats «s в то время чтения цикла:

<input> | while IFS= read -r f; do stat "$f" &>/dev/null && echo "$f"; done 

Обратите внимание, что это решение является медленно, потому что петли в коде оболочки, и называет внешняя утилита (создает дочерний процесс, stat) на каждой итерации.

+1

Ваше желание - моя команда. – mklement0

1

Если у вас есть 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 
0

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

Он совместим с именами файлов с пробелами.

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 
Смежные вопросы