我有一个bash脚本,应该是所有不是.avi,.mp4和.mkv的文件。
这是我试过的:
{{1}}
但是这个脚本会删除所有文件。
答案 0 :(得分:1)
除了将||
更改为&&
之外,脚本很脆弱,
例如,如果任何文件包含空格,它将无法工作。
通常,将find
的输出存储在变量中以进行循环是不安全的,因此应避免这种做法。
在任何情况下,您都不需要循环,find
可以自行完成所有操作,更安全:
find /home/mattia/test/ -type f ! \( -name '*.mp4' -o -name '*.mkv' -o -name '*.avi' \) -print -delete
请注意,您可以使用更直观的!
代替-not
,
但请记住,它不符合POSIX。
答案 1 :(得分:0)
合乎逻辑
[[ "$ext" != "mp4" || "$ext" != "mkv" || "$ext" != "avi" ]]
总是如此。例如:如果文件名为movie.avi
,则"$ext" != "mp4"
将为true,因此完整if将始终为true。
与往常一样,有很多方法可以解决这个问题。 Janos在find
做了这件事。另一种选择是:
find /find /home/mattia/test/ -type f -name '*.*'home/mattia/test/ -type f -name '*.*' |
egrep -v '.mp4$|.mkv$|.avi$' |
xargs rm
或者,在你的循环中:
#!/bin/bash
FILES=$(find /home/mattia/test/ -type f -name '*.*')
for f in $FILES
do
ext=${f#*.}
echo $ext
case "$ext" in
(mp4) echo "Keeping $f"
;;
(mkv) echo "Not deleting $f"
;;
(avi) echo "Holding on to $f"
;;
(*) rm -f "$f"
echo "deleted $f"
;;
esac
done
(只要你的文件名没有空格就可以工作)
或者整理if条件
[[ ! ( "$ext" = "mp4" || "$ext" = "mkv" || "$ext" = "avi" ) ]]