2012-04-19 81 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/"