如何从bash中的文件中读取文件名列表?

agn*_*nul 31 bash scripting

我正在尝试编写一个bash脚本来处理一个文件列表,这些文件的名称在输入文件中每行存储一个,类似于

find . -type f -mtime +15 > /tmp/filelist.txt
for F in $(cat /tmp/filelist.txt) ; do
  ...
done;
Run Code Online (Sandbox Code Playgroud)

我的问题是filelist.txt中的文件名可能包含空格,因此上面的剪切将扩展该行

my text file.txt
Run Code Online (Sandbox Code Playgroud)

三个不同的文件名my,textfile.txt.我该如何解决这个问题?

Dou*_*der 42

用途read:

while read F  ; do
        echo $F
done </tmp/filelist.txt
Run Code Online (Sandbox Code Playgroud)

或者使用IFS来更改shell分隔列表的方式:

OLDIFS=$IFS
IFS="
"
for F in $(cat /tmp/filelist.txt) ; do
  echo $F
done
IFS=$OLDIFS
Run Code Online (Sandbox Code Playgroud)

或者(如@tangens所建议的),将循环体转换为单独的脚本,然后使用find's -exec选项运行if对于直接找到的每个文件.


Pau*_*ce. 7

您可以在没有使用进程替换的临时文件的情况下执

while read F
do
  ...
done < <(find . -type f -mtime +15)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,进程替换功能是bash扩展,甚至在sh兼容模式下也不能使用bash.你必须用`#!/ bin/bash`开始你的脚本才能工作.顺便说一下,我还建议使用`while IFS =""read -r F`来避免文件名开头或结尾处的空格可能出现问题,最后是反斜杠(尽管文件来自Windows,反斜杠可能不是可能). (2认同)

DVK*_*DVK 6

阅读时使用

cat $FILE | while read line
do
echo $line
done
Run Code Online (Sandbox Code Playgroud)

您可以使用管道进行重定向而不是 cat