我試圖將所有文件從一個目錄複製到另一個目錄,同時刪除所有文件擴展名。如何使用find來複制和刪除保持相同子目錄結構的擴展
From directory 0001:
0001/a/1.jpg
0001/b/2.txt
To directory 0002:
0002/a/1
0002/b/2
我試過了幾個發現... | xargs c ... p沒有運氣。
我試圖將所有文件從一個目錄複製到另一個目錄,同時刪除所有文件擴展名。如何使用find來複制和刪除保持相同子目錄結構的擴展
From directory 0001:
0001/a/1.jpg
0001/b/2.txt
To directory 0002:
0002/a/1
0002/b/2
我試過了幾個發現... | xargs c ... p沒有運氣。
遞歸副本真的很容易與tar
。你的情況:
tar -C 0001 -cf - --transform 's/\(.\+\)\.[^.]\+$/\1/' . |
tar -C 0002 -xf -
+1 - 你應該改變正則表達式:普遍刪除任何擴展名,不僅JPG(OP問) - 否則,很好的解決方案。 – kobame
這個新的正則表達式幾乎沒問題,但是會用文件名「.profile」來做這個例子呢? – kobame
好的解決方案。測試260000個文件(4小時)。 – user1345178
我想出了這個醜小鴨:
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
第一行創建的目錄樹,而第二行復制文件。這個問題是:
如果你還沒有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命令:
sed
做一些化妝品路徑清洗,(像校正/some/path/./other/dir)xargs
將採取全線執行準備命令,但是,它會好很多:
更簡單,更乾淨,更快(不需要c hecking /創建目標子目錄)!
我對2步法感興趣,因爲該目錄包含大約1000000個文件。所以FASTER是國王。 – user1345178
Milion文件?因此,在這種情況下(IMO),兩種管道式焦油是最佳解決方案。如果你沒有tar --transform,下載並編譯。肯定會比啓動milion cp命令更快。 – jm666
這裏的一些發現+的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
選項。
+1,我正要寫這樣的答案。這裏最優雅和適當的工具:) – Zlatko
應該是什麼行爲是如果有兩個文件(例如1.txt的和1.JPG)在具有除了擴展相同的名稱相同的目錄? –
所有文件名都由一個唯一的ID預先加上,所以不存在命名衝突的風險。 – user1345178