我想删除文件夹中除 csv 文件之外的所有内容
我正在尝试使用 bash 脚本,但收到此错误:
syntax error near unexpected token `('
这是我的脚本:
PATH=/tmp/
run_spark_local
rm -v !($PATH*.csv)
cp -r $PATH /data/logs/
我也尝试过
rm -v !("$PATH*.csv")
答案1
请不要设置 $PATH 它是一个环境变量。
对于 BASH,只要外部全局变量shell 选项已启用(这是许多 Linux 发行版的默认设置),它只是:
rm !(*.csv)
使用文件夹路径,它将类似于...
rm yourfolder/!(*.csv)
如果您认为 extglob 在您的环境中未启用,只需执行以下操作:
shopt -s extglob
答案2
您应该避免设置该PATH
变量。 shell 使用它来查找有效命令,将其设置为/tmp/
将阻止脚本完全找到rm
和cp
命令。
您可以使用以下find
命令完成您想要的操作:
find /tmp -not -name '*.csv' -not -path /tmp -exec rm -vr {} \;
注意:这也会删除 /tmp 下的所有子目录。如果您不希望这样,则必须更改为:
find /tmp -not -name '*.csv' -type f -exec rm -v {} \;
另请注意:这仍然会递归到子目录并删除其中的文件。如果您不希望这样,您可以使用以下maxdepth
参数:
find /tmp -not -name '*.csv' -maxdepth 1 -type f -exec rm -v {} \;
额外注意:我永远不会运行find ... -exec
您在网上找到的命令,而不先验证它是否会执行您需要它执行的操作。你应该运行:
find /tmp -not -name '*.csv' -not -path /tmp
并在添加该位之前验证它是否只找到您想要的文件-exec rm -vr {} \;
。
答案3
/tmp
我建议只复制您感兴趣的文件,而不是删除 中的其他所有内容:
cp /tmp/*.csv /data/logs/
甚至
mv /tmp/*.csv /data/logs/
如果您不需要将它们保留在/tmp
.
这假设您感兴趣的所有文件都直接位于/tmp
;你的使用rm
表明它们是。
由于/tmp
它是一个共享临时目录,因此它可能包含其他正在运行的进程希望在那里找到的其他文件,并且删除/tmp
除 CSV 文件之外的所有内容可能会产生不良后果。正如其他人提到的,您也不应该进行更改,PATH
因为您的 shell 使用它来查找您正在使用的命令。