[英]How can I read a list of filenames from a file in bash?
我正在嘗試編寫一個bash腳本來處理一個文件列表,這些文件的名稱在輸入文件中每行存儲一個,類似於
find . -type f -mtime +15 > /tmp/filelist.txt
for F in $(cat /tmp/filelist.txt) ; do
...
done;
我的問題是filelist.txt中的文件名可能包含空格,因此上面的剪切將擴展該行
my text file.txt
三個不同的文件名, my
, text
和file.txt
。 我該如何解決這個問題?
使用read
:
while read F ; do
echo $F
done </tmp/filelist.txt
或者使用IFS來更改shell分隔列表的方式:
OLDIFS=$IFS
IFS="
"
for F in $(cat /tmp/filelist.txt) ; do
echo $F
done
IFS=$OLDIFS
或者(由@tangens的建議),將您的循環體為一個單獨的腳本,然后用find
的-exec選項,如果為每個文件直接找到運行。
您可以在沒有使用進程替換的臨時文件的情況下執
while read F
do
...
done < <(find . -type f -mtime +15)
閱讀時使用
echo $FILE | while read line
do
echo $line
done
你可以做重定向而不是回聲
您可以使用find
的-exec
參數並直接使用文件名:
find . -type f -mtime +15 -exec <your command here> {} \;
{}
是文件名的占位符。
在讀取循環時直接將查找命令傳遞給管道
find . -type f -mtime +15 | while read -r line
do
printf "do something with $line\n"
done
無論如何我都不是bash專家(我通常用ruby或python編寫我的腳本來進行跨平台),但是在處理之前我會使用正則表達式來解除每行中的空格。
對於Bash Regex: http : //www.linuxjournal.com/node/1006996
在Ruby中的類似情況(處理csv文件,並在使用之前清理每一行):
File.foreach(csv_file_name) do |line|
clean_line = line.gsub(/( )/, '\ ')
#this finds the space in your file name and escapes it
#do more stuff here
end
我相信你可以完全跳過臨時文件,只是直接迭代find的結果,即:
for F in $(find . -type f -mtime +15) ; do
...
done;
不保證我的語法是正確的,但我很確定這個概念是有效的。
編輯:如果你真的必須使用文件名列表處理文件,並且不能像上面那樣簡單地組合命令,那么你可以改變IFS
變量的值 - 它代表內部字段分隔符 - 到改變bash如何確定字段。 默認情況下,它設置為空白,因此換行符,空格或制表符將開始一個新字段。 如果將其設置為僅包含換行符,則可以像以前一樣迭代文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.