/ dir / grouped
- это мой путь. В сгруппированной папке
у меня есть два типа файлов в целом (файлы, содержащие файлы .txt
, и файлы, которые их не содержат). Например,
/ dir / grouped / file1
содержит файл .txt / dir / grouped / file2
не содержит файл .txt Я хочу удалить файл2 (поскольку он не содержит .txt файл) из сгруппированных. Как это сделать с терминала.
Читать man find
, man xargs
, man sed
, man uniq
. Я решил бы Вашу проблему как это:
'*.txt'
файлы. Для простоты я приму '*.txt'
имена файлов НЕ содержат пробелы.'*.txt'
файлы.echo rm -rfv
. (Удалите echo
когда Вы счастливы),Вот один путь:
ПРЕДУПРЕЖДЕНИЕ я выполнил части этого как Подтверждение концепции, но НЕ сделал Сквозного теста.
# --depth imposes a bottom-up order
find /dir/groupd --depth -type d --print >/tmp/alldir.tmp
# 'sed ...' changes '/dir/groupd/file1/foo.txt' to
# '/dir/groupd/file1'.
# and `uniq` keeps only one, no matter how often '/dir/groupd/file1'
# is generated.
find /dir/groupd --depth --type f -name '*.txt' --print | \
sed -e 's%/[^/]*$%%' | \
uniq >/tmp/txtdir.tmp
#
grep -E -v -f /tmp/txtdir.tmp /tmp/alldir.tmp >/tmp/nontxtdir.tmp
# inspect /tmp/nontxtdir.tmp, or
xargs </tmp/nontxtdir.tmp echo rm -rfv
Можно сделать это со всеми функциями Bash, плюс rm
:
root='/dir/grouped'
# Make globs null if there's no match.
shopt -s nullglob
# For each dir in the root dir
for dir in "$root"/*/; do
# Get array of .txt files.
files=("$dir"*.txt)
# If the array is not empty
if [[ ${#files[@]} -ne 0 ]]; then
echo "Contains .txt files: $dir"
echo rm -rfv "$dir" # Remove 'echo' when done testing.
else
echo "Does not contain .txt files: $dir"
fi
done