Bash

按其中包含的日期組織文件

  • October 22, 2021

我目前正在嘗試編寫一個腳本,將文件列表按日期組織到子目錄中。日期包含在格式中每個文件的第一行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。

以下應該做:

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

引用自:https://unix.stackexchange.com/questions/674247