
我目前正在嘗試編寫一個腳本,該腳本可以按日期將文件清單組織到子目錄中。日期包含在每個文件的第一行,格式為YYYY-MM-DD
.我已經使用 head 命令從每個文件中提取了第一行,並將其替換為 ,-
使其/
變為YYYY/MM/DD
.這樣我就可以將它用作檔案路徑。
然後我想建立子目錄YYYY>MM>DD
,例如,包含日期的檔案2015/10/19
儲存在檔案路徑./2015
-> ./2015/10
->中./2015/10/19
。這些子目錄應該創建在~/fileList/
.
這是我到目前為止的程式碼。
for file in ~/fileList/*
do
head -1 $file | tr "-" "/")
done
這是一個範例文件
2001-02-03
Thursday
Paris
44952
我正在努力尋找一種方法來建立子目錄並將每個檔案儲存在正確的目錄中。任何代碼建議將不勝感激。
我正在使用 bash shell。
答案1
應執行以下操作:
for file in ~/fileList/*
do
newpath=$(head -1 "$file" | tr '-' '/')
mkdir -p "$newpath"
echo "would now execute 'mv $file $newpath'"
done
這會將轉換後的日期儲存在變數中$newpath
,並建立該目錄以及任何缺少的父目錄(如果該目錄尚不存在)。該子目錄將在您執行腳本的目錄中建立。
在當前的形式中,它將列印將要執行的命令。當您滿意後,改為
mv "$file" "$newpath"
更新:由於您聲明目標目錄將位於檔案最初所在的來源目錄下方,因此有必要進行檢查,以確保您多次執行腳本時,它不會偶然發現這些新產生的條目。
- 如果您可以透過檔案副檔名(例如 )來識別文件
.txt
,則可以使循環更加具體:for file in ~/fileList/*.txt do newpath=~/fileList/$(head -1 "$file" | tr '-' '/') ... done
- 否則,一種方法是僅接受常規文件作為操作數:
for file in ~/fileList/* do if [[ ! -f $file ]]; then continue; fi newpath=~/fileList/$(head -1 "$file" | tr '-' '/') mkdir -p "$newpath" mv "$file" "$newpath" done