2016-08-22 63 views
1

我有幾乎500的PDF文件具有下列文件名結構的列表:Linux的批處理文件複製到基於文件名模式目錄

XXXX-YYYY-MM-DD.pdf 

其中XXXX是可變lenght數字代碼(1至4位 )總是定界「 - 」,例如:

51-2016-08-22.pdf 
776-2016-08-22.pdf 
3881-2016-08-22.pdf 
4-2016-08-22.pdf 
2860-2016-08-22.pdf 

的目標是每個文件複製到自己的目錄,命名的目錄像模式(即:文件776-2016-08-22.pdf去到目錄776)。我如何使用awk或sed來定義變量長度字段?

這裏是我的代碼:

for f in *.pdf 

    do 
     FOLDERNAME=`echo $f| awk (awk or sed missing code here)` 
     mkdir /my/dir/structure/$FOLDERNAME 
     cp $f /my/dir/structure/$FOLDERNAME/ 
    done 

感謝您的支持。

+1

瞭解如何使用shell參數擴展運營商,而不是管道到程序:https://www.gnu.org/software/bash/manual/html_node/Shell- Parameter-Expansion.html#Shell-Parameter-Expansion – Barmar

+0

'sed s /-.*//'將刪除從第一個'-'開始的所有內容。 – Barmar

回答

5

您可以使用:

for f in *.pdf; do 
    d="${f%%-*}" 
    mkdir -p "$d" && cp "$f" "$d" 
done 
+0

感謝@anubhava您的帖子。相同的語法是否也有效提取文件名的一部分,或者我應該使用sed來達到這個目的嗎?例如:如果我還必須使用year(YYYY)作爲文件夾名稱創建子文件夾,那麼您會推薦哪種語法? –

+2

爲了使用年份創建目錄,我建議使用BASH正則表達式,如下所示:**'for * in * .pdf; do [[$ f =〜^ [^ - ] + - ([0-9] {4}) - ]] && echo mkdir -p「$ {BASH_REMATCH [1]}」; echo cp「$ f」「$ d」; done' ** – anubhava

1

正如ed-morton正確指出,這是不是推薦的解決方案,因爲它在許多情況下失敗。請按照https://stackoverflow.com/a/39089589/3834860

保存此答案以供參考。

awk -F '-'指定分隔符前的第一個元素和'{print $1}'

for f in *.pdf 

do 
    FOLDERNAME=`echo $f| awk -F '-' '{print $1}'` 
    mkdir /my/dir/structure/$FOLDERNAME 
    cp $f /my/dir/structure/$FOLDERNAME/ 
done 
+1

感謝@EdMorton的評論。 –

相關問題