删除不在包含目录名称列表的文件中的目录
delete directories not in the file containing directory names list
我有一个文件,其中包含我要保留的目录名称列表。说 file1 其内容是目录名称,如
- 目录 1
- 目录 2
- dir3
另一方面,我的目录(实际目录)有像
这样的目录
- 目录 1
- 目录 2
- dir3
- dir4
- 目录
我想做的是从我的 dir4、dirs 和 file1 中删除其名称不存在的其他目录目录。 file1 每行有一个目录名。 dir4和dirs下可能有子目录或文件需要递归删除。
我可以使用 xargs 删除我的目录中列表中的文件
xargs -a file1 rm -r
但我不想删除,而是想保留它们并删除不在 file1 上的其他文件。可以做
xargs -a file1 mv -t /home/user1/store/
并删除了我目录中剩余的目录但我正在徘徊是否有更好的方法?
谢谢。
find . -maxdepth 1 -type d -path "./*" -exec sh -c \
'for f; do f=${f#./}; grep -qw "$f" file1 || rm -rf "$f"; done' sh {} +
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=
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
我有一个文件,其中包含我要保留的目录名称列表。说 file1 其内容是目录名称,如
- 目录 1
- 目录 2
- dir3
另一方面,我的目录(实际目录)有像
这样的目录- 目录 1
- 目录 2
- dir3
- dir4
- 目录
我想做的是从我的 dir4、dirs 和 file1 中删除其名称不存在的其他目录目录。 file1 每行有一个目录名。 dir4和dirs下可能有子目录或文件需要递归删除。
我可以使用 xargs 删除我的目录中列表中的文件
xargs -a file1 rm -r
但我不想删除,而是想保留它们并删除不在 file1 上的其他文件。可以做
xargs -a file1 mv -t /home/user1/store/
并删除了我目录中剩余的目录但我正在徘徊是否有更好的方法?
谢谢。
find . -maxdepth 1 -type d -path "./*" -exec sh -c \
'for f; do f=${f#./}; grep -qw "$f" file1 || rm -rf "$f"; done' sh {} +
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=
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