cat dirs.txt | while read dir; do
ls -al "$dir"
done
Когда вы используете оператор backtick, выходные данные разбиваются на токены для каждого символа пробела. read
, с другой стороны, будет читать по одной строке за раз, а не по одному слову за раз. Таким образом, решение, которое выглядит довольно странно, состоит в том, чтобы передать файл в цикл, чтобы его можно было читать построчно.
Вам необходимо указать "$dir"
в команде ls
, чтобы все имя файла, пробел и все обрабатывалось как один аргумент. Если вы этого не сделаете, ls
увидит два имени файла, /var/tmp/old
и files.txt
.
Я, вероятно, получу премию Бесполезное использование кошки . Вы можете упростить это еще больше, удалив cat
:
while read dir; do
ls -al "$dir"
done < dirs.txt
Это работает, потому что цикл весь while
действует как одна большая команда, поэтому точно так же, как вы можете передать cat
в нее, вы также можете использовать перенаправление файлов.
Еще дальше ...
В зависимости от того, как генерируется dirs.txt
, вы можете просто полностью избавиться от него и сделать все одной командой. Если это просто временный файл, вы можете удалить его, отправив команду, генерирующую dirs.txt
в цикл while
, пропуская временный файл. Например, заменить
find /var -name '*old*' > dirs.txt
while read dir; do
ls -al "$dir"
done < dirs.txt
с
find /var -name '*old*' | while read dir; do
ls -al "$dir"
done
Притворись find
- это любая команда, которую ты делаешь для создания списка файлов.
И на самом деле, если вы на самом деле используете find
, вы, вероятно, можете сделать все одной большой командой find
без каких-либо циклов или чего-либо еще! Например, приведенный выше код с использованием find
и while
можно выполнить с помощью одной команды find
, например:
find /var -name '*old*' -exec ls -al {} \;
find
- это действительно гибкая команда, которая может как искать файлы, соответствующие всем видам сложных критериев, так и передавать эти файлы в качестве аргументов командной строки другим командам, используя параметр -exec
. При использовании -exec
{}
заменяется каждым именем файла.