Удаление папок из каталога, который не содержит файлов .txt внутри [закрыто]

/ dir / grouped - это мой путь. В сгруппированной папке у меня есть два типа файлов в целом (файлы, содержащие файлы .txt , и файлы, которые их не содержат). Например,

  • / dir / grouped / file1 содержит файл .txt
  • / dir / grouped / file2 не содержит файл .txt

Я хочу удалить файл2 (поскольку он не содержит .txt файл) из сгруппированных. Как это сделать с терминала.

0
задан 11 July 2018 в 21:08

2 ответа

Читать man find, man xargs, man sed, man uniq. Я решил бы Вашу проблему как это:

  1. Произведите список ВСЕХ каталогов. Те, которые Вы хотите удалить, находятся в этом списке.
  2. Произведите список всех каталогов, содержащих '*.txt' файлы. Для простоты я приму '*.txt' имена файлов НЕ содержат пробелы.
  3. Вычтите два списка, дав список каталогов, не содержащих '*.txt' файлы.
  4. Передайте этот список 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
0
ответ дан 28 October 2019 в 08:57

Можно сделать это со всеми функциями 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
0
ответ дан 28 October 2019 в 08:57

Другие вопросы по тегам:

Похожие вопросы: