[英]filter files with find command, sort output into directories
#!/bin/env bash
MONTHS=(Jan Feb Mar ...)
for month in ${MONTHS[@]}
do
if [ ! -d $month ]; then
mkdir $month
fi
# below is the code I would like to improve upon
find ./ -iname "*$month*.pdf" -type f | xargs mv $month/
done
我正在嘗試做的是:
1)使用變量MONTHS
,通過首先檢查是否存在具有該名稱的目錄來遍歷每個迭代,如果不存在,則創建具有名稱的目錄(因此,當month=Jan
,如果Jan
目錄不存在,它將創建一個Jan
目錄。如果確實存在,請進行下一行操作,等等)。
2)在當前目錄中查找名稱中具有month變量的文件(因此它將查找文件名Feb
, Mar
等中帶有單詞Jan
所有文件)。
3)通過將輸出移至具有相同月份變量名稱的目錄來傳遞輸出(因此,所有Jan
文件都移至Jan
目錄, Feb
文件移至Feb
目錄,依此類推)。
我一直在嘗試編碼最后一個find
命令行已經有一段時間了,我檢查了大多數相關問題,但是我得到的最多是一個錯誤,說我無法將fileThatHasMonthInTheName.pdf
移動到其自己的子目錄sameLongFilename
或者試圖將月份文件夾移到其自身。
我的目標是:查找文件名中具有月份名稱的文件,將其通過管道傳遞給具有相同月份名稱的目錄
由@thanasisp產生輸出的命令
find . -maxdepth 1 -type f -name "*$month*" | xargs -I{} mv {} $month
您可以進行這些修改
MONTHS=( Jan Feb Mar )
for month in ${MONTHS[@]}
do
mkdir -p $month
find . -maxdepth 1 -type f -name "*$month*" | xargs -I{} mv {} $month
done
mkdir -p
將創建目錄(如果不存在)
find
文件應限制為maxdepth 1
以便不會返回以前復制到現有月份目錄的文件
與-I
一起使用xargs
以便在正確的位置處理查找輸出,保留帶空格的任何參數,例如,名為Jan 01.csv
的文件
正如另一個答案所解釋的,find會遞歸到子目錄中。 我的解決方案只是使用ls,而不會(它只會顯示當前目錄中的文件):
#!/bin/bash
MONTHS=(Jan Feb Mar ...)
for month in ${MONTHS[@]}
do
if [ ! -d $month ]; then
mkdir $month
fi
/bin/ls *$month*.pdf | xargs mv -t $month
done
我使用/ bin / ls來確保我沒有某些腳本喜歡的別名格式。
注意:我編輯ls命令以包括缺少的*。 現在是/bin/ls *$month*.pdf
就像OP想要的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.