-2

для каждого файла .ext1 я создаю второй файл .ext2 с тем же именем файла, за исключением расширения, а затем удаляю все файлы .ext1 . Иногда процесс может завершиться сбоем, поэтому я не хотел бы знать, как удалить только файлы .ext1 , имеющие аналог .ext2 . Я хочу что-то вроде этого:

#!/bin/bash

ext1s=$(ls -l *.ext1 2>/dev/null | wc -l)
if [ $ext1s -ge 0 ]; then
  generates .ext2 files
  ext2s=$(ls -l *.ext2 2>/dev/null | wc -l)
  if [ $ext1s -eq $ext2s ]; then
    rm *.ext1
  else
    what i need
  fi
else
  echo no .ext1 files
  exit
fi

3 ответа3

0

У меня есть решение, если есть лучший способ сделать это, пожалуйста, поделитесь.

#!/bin/bash

ext1s=$(ls -l *.ext1 2>/dev/null | wc -l)
if [ $ext1s -ge 0 ]; then
  generates .ext2 files
  ext2s=$(ls -l *.ext2 2>/dev/null | wc -l)
  if [ $ext1s -eq $ext2s ]; then
    rm *.ext1
  else
    list=$(comm -12 <(find *.ext1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find *.ext2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort))
    for file in $list ; do
      rm $file.ext1
    done
  fi
else
  echo no .ext1 files
  exit
fi
0

Просто переберите файлы *.ext2 и удалите соответствующий файл .ext1 если он существует.

for f in *.ext2;do rm -f "$(basename "$f" .ext2).ext1";done

basename не только извлекает имя файла из полного пути, но также удаляет расширение, если оно снабжено вторым аргументом, поэтому "$(basename "$f" .ext2).ext1" удаляет расширение .ext2 и заменяет его на .ext1 .

-f на rm сохраняет молчание, если файл .ext1 не существует.

Версия без базового имени:

for f in *.ext2;do rm -f "${f%.ext2}.ext1";done
0

Мне не нравится использование ненужных внешних программ и связанные с этим накладные расходы: решение спрашивающего планирует ls (дважды), wc (дважды), find (дважды), comm , bash (дважды), basename (дважды) и sort (дважды).

Ничего из этого не требуется: все они могут обрабатываться внутренними компонентами bash :

for f in *.ext1
do   if [ "$f" == "*.ext1" ]
     then echo no files
     elif [ -e "${f%.ext1}.ext2" ]
     then rm "$f"
     else
          # Insert here the code to create the .ext2 file from "$f"
     fi
done

Если ни один файл не соответствует *.ext1 тогда для f будет установлено это единственное значение; в противном случае цикл будет пройден для каждого соответствующего файла. (Примечание: если вы достаточно безумны, чтобы создать файл с буквальным именем *.ext1 , проверка "без файлов" завершится неудачей.)

Для каждого .ext1 файла, наличие соответствующего .ext2 файла проверяется: если он существует, то .ext1 удаляется; в противном случае код вызывается для создания файла .ext2 (опционально, если это успешно, исходный файл .ext1 можно удалить, избегая в будущем лишних файлов .ext1 ).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .