簡體   English   中英

使用find命令過濾文件,將輸出分類到目錄中

[英]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變量的文件(因此它將查找文件名FebMar等中帶有單詞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.

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