假设我想复制一个目录的内容,不包括名称包含单词“音乐”的文件和文件夹。
cp [exclude-matches] *Music* /target_directory
应该用什么来代替[排除匹配]来实现这一点?
假设我想复制一个目录的内容,不包括名称包含单词“音乐”的文件和文件夹。
cp [exclude-matches] *Music* /target_directory
应该用什么来代替[排除匹配]来实现这一点?
当前回答
我个人倾向于使用grep和while命令。这允许您编写强大而可读的脚本,以确保您最终做的正是您想要的。另外,通过使用echo命令,您可以在执行实际操作之前进行演练。例如:
ls | grep -v "Music" | while read filename
do
echo $filename
done
会打印出你要复制的文件。如果列表是正确的,下一步是简单地将echo命令替换为copy命令,如下所示:
ls | grep -v "Music" | while read filename
do
cp "$filename" /target_directory
done
其他回答
在bash中,shopt -s extglob的替代方法是GLOBIGNORE变量。它并不是更好,但我发现它更容易记住。
下面的例子可能就是最初的海报想要的:
GLOBIGNORE="*techno*"; cp *Music* /only_good_music/
完成后,取消设置GLOBIGNORE,以便能够在源目录中rm *techno*。
我个人倾向于使用grep和while命令。这允许您编写强大而可读的脚本,以确保您最终做的正是您想要的。另外,通过使用echo命令,您可以在执行实际操作之前进行演练。例如:
ls | grep -v "Music" | while read filename
do
echo $filename
done
会打印出你要复制的文件。如果列表是正确的,下一步是简单地将echo命令替换为copy命令,如下所示:
ls | grep -v "Music" | while read filename
do
cp "$filename" /target_directory
done
不是bash(据我所知),而是:
cp `ls | grep -v Music` /target_directory
我知道这不是你想要的,但它能解决你的问题。
你也可以使用一个非常简单的for循环:
for f in `find . -not -name "*Music*"`
do
cp $f /target/dir
done
这样就可以排除“音乐”
cp -a ^'Music' /target
排除音乐之类的东西?*还是*?音乐
cp -a ^\*?'complete' /target
cp -a ^'complete'?\* /target