2012-04-19 34 views
1

我必須將某個文件從一個目錄移到另一個目錄,但這有點棘手。如何在linux中執行自定義複製命令?

這裏是我的文件夾結構

/var/www/media_test1/media001/001_pm_001.jpg 
           th001_pm_001.jpg 

/var/www/media_test1/media002/002_pm_001.jpg 
           th002_pm_001.jpg 

/var/www/media_test1/media003/003_pm_001.jpg 
           th003_pm_001.jpg 

/var/www/media_test1/media004/004_pm_001.jpg 
           th004_pm_001.jpg 

我基本上要由每個文件夾沒有th圖片移動到另一個目錄是這樣的:

/var/www/media_test2/media001/001_pm_001.jpg 
/var/www/media_test2/media002/002_pm_001.jpg 
/var/www/media_test2/media003/003_pm_001.jpg 
/var/www/media_test2/media004/004_pm_001.jpg 

我在想什麼是通過使用s ls命令創建我想要移動的圖像列表,列出所有圖片+它們的路徑,但沒有th - >將其導出到文件 - >生成cp命令,如:

cp /var/www/media_test1/media001/001_pm_001.jpg /var/www/media_test2/media001/001_pm_001.jpg 
cp /var/www/media_test1/media002/002_pm_001.jpg /var/www/media_test2/media001/002_pm_002.jpg 
... 

然後執行該命令。

問題是我不知道如何編寫這些命令。

有沒有更好的方法來做到這一點?關於我可以使用什麼命令的任何想法?

謝謝

回答

2

您可以使用find命令來做到這一點。確保目標目錄存在,然後運行:

find /var/www/media_test1/media001/ -type f -not -name "th*" -exec cp {} /var/www/media_test2/media001/ \; 

這會發現,不以「th」開頭,並將它們複製所有文件到/ var/WWW/media_test2/MEDIA001 /。

+0

我有很多文件夾中。我需要以某種方式找到像'/ var/www/media_test1/media001/file'和'/ var/www/media_test1/media002/file'這樣的所有路徑並將它們保存到一個文件中,這樣我就可以創建'cp'命令 – Patrioticcow 2012-04-19 17:26:43

1

您可以使用mmv,如果你不需要它太靈活:

mmv '/var/www/media_test1/media???/???_pm_*.jpg' '/var/www/media_test2/media#1#2#3/#4#5#6_pm_#7.jpg' 

這雖然不會創建目標文件夾;你將不得不這樣做。

如果您需要它更靈活,或爲您創建目標文件夾,最好編寫一個腳本。

0

我在這裏使用了mv命令。因爲你最開始說「我必須移動一些文件」......但是你可以將它改爲cp ......兩者的結構都是一樣的...... sed表達式末尾的|e會導致sed生成的腳本被自動執行。你實際上並沒有看到這個腳本,所以我在這篇文章的末尾添加了它)... mkdir -p將檢查目錄是否已經存在,如果沒有,那麼它就會生效。如果mkdir失敗,則不會執行下一個命令。

# use `find' to get the main list of files.. 
# use `sed' to filter when both 'NNN's match in: /mediaNNN/NNN... 
# `sed' also build and executes the *move* script 

basepath1=/var/www/media_test1/ 
basepath2=/var/www/media_test2/ 

find $basepath1/media[0-9][0-9][0-9] \ 
     -type f -name '[0-9][0-9][0-9]*.jpg' | 
sed -nr " 
s|$basepath1(/media([0-9]{3})/)\2.*|\ 
mkdir -p \"$basepath2\1\" \&\&\n\ 
    mv -n \"&\" \\\\\n\ 
     \"$basepath2\1\"|e" 

這裏是生成的腳本

mkdir -p "/var/www/media_test2/media001/" && 
    mv -n "/var/www/media_test1/media001/001_pm_001.jpg" \ 
     "/var/www/media_test2/media001/" 
mkdir -p "/var/www/media_test2/media002/" && 
    mv -n "/var/www/media_test1/media002/002_pm_001.jpg" \ 
     "/var/www/media_test2/media002/" 
mkdir -p "/var/www/media_test2/media003/" && 
    mv -n "/var/www/media_test1/media003/003_pm_001.jpg" \ 
     "/var/www/media_test2/media003/" 
mkdir -p "/var/www/media_test2/media004/" && 
    mv -n "/var/www/media_test1/media004/004_pm_001.jpg" \ 
     "/var/www/media_test2/media004/"