我正在尝试写一个非常简单的Bash shell脚本,它将cd放在一个特定的目录中,它将删除除一些选定的文件和目录之外的所有文件和目录,然后cd返回到原始目录。
我的代码是:
#!/bin/bash
cd /path/to/desired/directory
shopt -s extglob
rm !\(filename1\|filename2\|filename3\) -rf
cd -我尝试了许多不同的方法来写符号'(‘和'|',使用单引号或双引号或反斜杠,但都不起作用。请注意,shopt -s extglob和rm !(filename1|filename2) -rf在脚本之外可以很好地工作。
也许我犯了一个标准的基本的bash-scripting错误,我看不到,但经验会来的……
有什么建议吗!?提前谢谢。
发布于 2013-11-05 13:33:31
我马上就能看到两个问题:
rm的-rf参数必须位于文件名之前,并且extglob说明符!、(、|和)不应使用反斜杠进行转义
试着这样做:
rm -rf !(filename1|filename2|filename3)如果它仍然不起作用,删除-f参数,您将得到关于哪里出了问题的错误消息,而不是默默地抑制它们。要打印出删除的每个文件的名称,还可以添加-v选项。
发布于 2013-11-05 16:06:06
如果您有最新版本的find,请使用:
find . -not -regex "filename1|filename2|filename3" -print检查输出,如果只打印您真正想要删除的文件,请将-print替换为-delete。
如果您的find版本不支持-delete,请使用-type f -exec rm "{}" \;
请注意,这只会删除文件。这一点很重要:如果您说要保留文件x,但该文件在文件夹y中,那么它将忽略x,只是在以后将其与整个文件夹y一起删除。
要清除所有空文件夹(并保留您想要保留的文件):
find . -type d -empty -exec rmdir "{}" \;(来源:How to Find and Delete Empty Directories and Files in Unix)
发布于 2013-11-05 18:37:14
我不建议尝试编写一条规则来免除特定文件。我更有可能做的是,尝试找到文件掩码/全局,或者在你想要删除的文件的名称中找到一些其他的锚点,而你想要保留的文件没有这些文件。在大多数情况下,您可能可以通过扩展来完成此操作。不幸的是,因为您没有提到任何文件的名称,所以我不能更具体地帮助您。
类似于两个(或更多) find循环:
find *.mp3 d.mp3 -maxdepth 1 -type f | while read mp3s
do
mv $mp3s ~/d.stuff-to-keep
done
find *.txt d.mp3 -maxdepth 1 -type f while read textfiles
do
rm -v $textfiles
done如果不是,请查找这些文件的一些其他常见特征。如果没有,您可能需要重命名您的文件,以便为自己指定一个。我总是在我的文件名中放很多锚(分离的名字段,扩展名等),因为这样我就有很多不同的方法来处理我需要的东西。我通常的名字格式是:-
<extension>.+<author>+<year>+<work-name>+<volume-number>+<number-of-volumes>加号是字段分隔符,破折号是空格,但没有破折号作为第一个或最后一个字符。全部为小写字母,不允许使用控制字符或其他非字母数字。因此,我可以使用awk、cut或其他任何我想要使用的工具将它们切分,并轻松地对它们进行重命名。将扩展名放在名称的开头,也意味着ls只需要一个标志(-l)就可以获得一个完美有序的文件系统。
如果您知道如何通过基本的POSIX工具将目录结构用作数据库,那么您有时不需要安装任何更复杂的东西来完成您想要的操作。
在UNIX中,文件名有一个长字符限制,以及用于导航长名称的制表符补全。不要害怕随意使用这两种方法。
https://stackoverflow.com/questions/19782342
复制相似问题