Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 删除目录中除列表中提到的文件以外的所有文件_Linux_Bash_Shell - Fatal编程技术网

Linux 删除目录中除列表中提到的文件以外的所有文件

Linux 删除目录中除列表中提到的文件以外的所有文件,linux,bash,shell,Linux,Bash,Shell,我有一个名为a00的目录,其中包含3000个扩展名为.SAC的文件。我有一个名为gd.list的文本文件,其中包含这3000个文件中88个文件的名称。我正在尝试编写一个代码,删除除gd.list中提到的那些文件之外的所有.SAC文件 如何使用shell/bash实现这一点?如果你觉得自己很勇敢,可以尝试以下方法 ls *.sac | fgrep -v -f gd.list | xargs echo rm 请注意,我在xargs中放置了一个echo,以确保没有人发生剪切粘贴事故 还要注意评论中提

我有一个名为a00的目录,其中包含3000个扩展名为.SAC的文件。我有一个名为gd.list的文本文件,其中包含这3000个文件中88个文件的名称。我正在尝试编写一个代码,删除除gd.list中提到的那些文件之外的所有.SAC文件


如何使用shell/bash实现这一点?

如果你觉得自己很勇敢,可以尝试以下方法

ls *.sac | fgrep -v -f gd.list | xargs echo rm
请注意,我在
xargs
中放置了一个
echo
,以确保没有人发生剪切粘贴事故


还要注意评论中提到的这种方法的局限性。正如我所说的,如果您感到勇敢…

那么
rm
命令将被注释掉,以便您可以检查并验证它是否在需要时工作。那就取消对那句话的评论吧

检查目录
部分将确保您不会意外地从错误的目录运行脚本并删除错误的文件

您可以删除
echo deleting
行以静默运行

#!/bin/bash

cd /home/me/myfolder2tocleanup/

# Exit if the directory isn't found.
if (($?>0)); then
    echo "Can't find work dir... exiting"
    exit
fi

for i in *; do
    if ! grep -qxFe "$i" filelist.txt; then
        echo "Deleting: $i"
        # the next line is commented out.  Test it.  Then uncomment to removed the files
        # rm "$i"
    fi
done

你可以在这里找到L.D.James的答案,这里有几种选择

我更愿意看到
find-Z
,因为它更清楚地划分了文件名:

find .  -maxdepth 1 -name '*.sac' -print0 | grep -x -z -Z -f gd.list | xargs -0 echo rm
再次,首先测试这个。也许可以对输出进行排序,并确保它与原始文件是唯一的

对于较小的文件名列表,我建议只使用find with-and-not-name and-delete,但是使用较大的列表可能会比较棘手

您可以将要保留的文件标记为只读,然后在rm中使用适当的设置删除通配符,或查找以跳过只读文件。假设您拥有只读标志。如果只读标志不适合您,您可以将文件标记为可执行文件,并使用find

另一种选择是将匹配的文件移动到临时文件夹,删除通配符,然后移动要保留的文件。这是假设您可以负担文件暂时消失的费用


要使它们在较短的时间内消失,请将保留的文件移出到临时目录,移出原始目录,移入临时目录,然后删除移出的目录。

像这样使用ls总是很危险的,因为文件名可能有空格。此外,如果有一个匹配项,grep将倾向于丢弃整行文件名。请避免“给我代码”问题,因为这些问题已经被问了很多次,并且回答了很多次,您必须努力避免找到答案。而是显示您正在处理的脚本,并说明问题所在。也看到