bash删除脚本不起作用

时间:2017-07-22 12:58:28

标签: linux bash ubuntu

我有一个bash脚本,应该是所有不是.avi,.mp4和.mkv的文件。

这是我试过的:

{{1}}

但是这个脚本会删除所有文件。

2 个答案:

答案 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" ) ]]