簡體   English   中英

如何從bash中的文件中讀取文件名列表?

[英]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

三個不同的文件名, mytextfile.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM