删除不在包含目录名称列表的文件中的目录

时间:2015-06-16 03:20:26

标签: bash shell xargs

我有一个文件,其中包含我要保留的目录名列表。说 file1 ,其内容是

等目录的名称
  • dir1
  • DIR2
  • DIR3

另一方面,我的目录(实际目录)有

之类的目录
  • DIR1
  • DIR2
  • DIR3
  • dir4
  • 显示目录

我想要做的是从我的目录中删除 dir4,dirs 以及其名称不存在于 file1 上的其他目录。 file1 每行都有一个目录名称。 dir4 dirs 下可能存在子目录或文件,需要递归删除。

我可以使用xargs删除My directory

中列表中的文件
  

xargs -a file1 rm -r

但是我想保留它们并删除不在file1上的其他内容,而不是删除它。可以吗

  

xargs -a file1 mv -t / home / user1 / store /

并删除我目录中的其余目录,但如果有更好的方法,我会徘徊?

感谢。

2 个答案:

答案 0 :(得分:1)

find . -maxdepth 1 -type d -path "./*" -exec sh -c \
    'for f; do f=${f#./}; grep -qw "$f" file1 || rm -rf "$f"; done' sh {} +

答案 1 :(得分:1)

Anish有一个很好的单行答案。如果你想要一些冗长的东西可以帮助你将来使用数据操作等,这里有一个冗长的版本:

#!/bin/bash

# send this function the directory name
# it compares that name with all entries in
# file1. If entry is found, 0 is returned
# That means...do not delete directory
#
# Otherwise, 1 is returned
# That means...delete the directory
isSafe()
{
    # accept the directory name parameter
    DIR=$1
    echo "Received $DIR"

    # assume that directory will not be found in file list
    IS_SAFE=1 # false

    # read file line by line
    while read -r line; do

        echo "Comparing $DIR and $line."
        if [ $DIR = $line ]; then
            IS_SAFE=0 # true
            echo "$DIR is safe"
            break
        fi

    done < file1

    return $IS_SAFE
}

# find all files in current directory
# and loop through them
for i in $(find * -type d); do

    # send each directory name to function and
    # capture the output with $?
    isSafe $i
    SAFETY=$?

    # decide whether to delete directory or not
    if [ $SAFETY -eq 1 ]; then
        echo "$i will be deleted"
        # uncomment below
        # rm -rf $i
    else
        echo "$i will NOT be deleted"
    fi
    echo "-----"

done