2012-09-25 52 views
6

我試圖將所有文件從一個目錄複製到另一個目錄,同時刪除所有文件擴展名。如何使用find來複制和刪除保持相同子目錄結構的擴展

From directory 0001: 
0001/a/1.jpg 
0001/b/2.txt 

To directory 0002: 
0002/a/1 
0002/b/2 

我試過了幾個發現... | xargs c ... p沒有運氣。

+0

應該是什麼行爲是如果有兩個文件(例如1.txt的和1.JPG)在具有除了擴展相同的名稱相同的目錄? –

+0

所有文件名都由一個唯一的ID預先加上,所以不存在命名衝突的風險。 – user1345178

回答

4

遞歸副本真的很容易與tar。你的情況:

tar -C 0001 -cf - --transform 's/\(.\+\)\.[^.]\+$/\1/' . | 
tar -C 0002 -xf - 
+0

+1 - 你應該改變正則表達式:普遍刪除任何擴展名,不僅JPG(OP問) - 否則,很好的解決方案。 – kobame

+1

這個新的正則表達式幾乎沒問題,但是會用文件名「.profile」來做這個例子呢? – kobame

+0

好的解決方案。測試260000個文件(4小時)。 – user1345178

0

我想出了這個醜小鴨:

find 0001 -type d | sed 's/^0001/0002/g' | xargs mkdir 
find 0001 -type f | sed 's/^0001//g' | awk -F '.' '{printf "cp -p 0001%s 0002%s\n", $0, $1}' | sh 

第一行創建的目錄樹,而第二行復制文件。這個問題是:

  1. 目前僅處理目錄和普通文件(沒有 符號鏈接等)
  2. 如果有任何時期(除了 擴展名)或特殊字符(空格等。 )在文件名 那麼第二個命令將不起作用。
2

如果你還沒有tar--transform這樣可以工作:

TRG=/target/some/where 
SRC=/my/source/dir 
cd "$SRC" 
find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" |\ 
    sed 's:/\.::;s:/./:/:' |\ 
    xargs -I% sh -c "%" 

\後不能有空格,需要行簡單的結束,也可以將其加入到像一條線:

find . -type f -name \*.\* -printf "mkdir -p '$TRG/%h' && cp '%p' '$TRG/%p'\n" | sed 's:/\.::;s:/./:/:' | xargs -I% sh -c "%" 

說明:

  • find會發現所有純文本文件你有什麼擴展你SRC(源)目錄
  • 查找的printf將準備所需的shell命令:
    • 命令創建的TRG所需要的目錄樹(目標目錄用於複製
  • sed做一些化妝品路徑清洗,(像校正/some/path/./other/dir)
  • 命令)
  • xargs將採取全線
  • 與外殼

執行準備命令,但是,它會好很多:

  • 簡單地做出精確副本第一步
  • 第二步重命名文件

更簡單,更乾淨,更快(不需要c hecking /創建目標子目錄)!

+0

我對2步法感興趣,因爲該目錄包含大約1000000個文件。所以FASTER是國王。 – user1345178

+0

Milion文件?因此,在這種情況下(IMO),兩種管道式焦油是最佳解決方案。如果你沒有tar --transform,下載並編譯。肯定會比啓動milion cp命令更快。 – jm666

1

這裏的一些發現+的bash +安裝將這樣的伎倆:

for src in `find 0001 -type f` # for all files in 0001... 
do 
    dst=${src/#0001/0002}   # match and change beginning of string 
    dst=${dst%.*}     # strip extension 
    install -D $src $dst   # copy to dst, creating directories as necessary 
done 

默認將所有複製的文件的權限模式更改爲rwxr-xr-x,多變與安裝的--mode選項。

+0

+1,我正要寫這樣的答案。這裏最優雅和適當的工具:) – Zlatko

相關問題