删除除 csv 文件之外的所有内容 Bash 脚本

删除除 csv 文件之外的所有内容 Bash 脚本

我想删除文件夹中除 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/将阻止脚本完全找到rmcp命令。

您可以使用以下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 使用它来查找您正在使用的命令。

相关内容