Удалить файлы с таким же именем, но с другим расширением

Awk solución:

awk '{
         for (i = 1; i <= NF; i++)    # iterating through all fields
             if ($i != "") {          # check if field value is not empty
                 c++; sub(/[^=]+=/, "", $i);
                 printf "%s%s", (c > 1? (c == 3? "/" : ",") : ""), $i
             }
             print "" 
     }' FS='|' file

La salida:

8921,03/20,869,1,2,3,4,5,6
0
08.05.2019, 16:50
4 ответа
for f in *.jpeg; do
  [ -e "${f%.*}.jpg" ] && echo rm -- "$f"
done

(удалить echoесли счастлив ).

С zshи одним rmвызовом:

echo rm -- *.jpeg(e'{[ -e $REPLY:r.jpg ]}')

(измените *на **/*, чтобы сделать это рекурсивно, добавьте квалификатор Dglob, если вы также хотите учитывать скрытые файлы или файлы в скрытых каталогах ).

5
28.01.2020, 02:18

Адаптация ответа на аналогичный вопрос:

find. -type f -name '*.jpeg' -exec sh -c '
    for pathname do
        jpg_pathname=${pathname%.jpeg}.jpg
        if [ -f "$jpg_pathname" ]; then
            printf "Would remove %s\n" "$pathname"
            # rm "$pathname"
        fi
    done' sh {} +

Находит пути ко всем файлам с суффиксом имени файла .jpegв текущем каталоге или ниже него. Для как можно больших пакетов этих путей вызывается краткий скрипт в строке -. Сценарий перебирает текущую группу путей и обнаруживает любой файл, который имеет ту же основу имени файла, за которой следует .jpg. Если файл .jpegимеет соответствующий файл .jpg, файл .jpegудаляется (, если закомментированный rmактивирован ).

Укороченная версия (с удаленными комментариями по безопасности и без вывода текста):

find. -type f -name '*.jpeg' -exec sh -c '
    for pathname do
        [ -f "${pathname%.jpeg}.jpg" ] && rm "$pathname"
    done' sh {} +

(Вы заметите, что это оказалось рекурсивной вариацией ответа Стефана Шазела)

3
28.01.2020, 02:18
readonly path="${1:-./}"

for file in "${path}"*.jpeg; do
  if [[ -f ${file%.jpeg}.jpg ]]; then
    rm -- "$file"
    printf '%s\n' "removed duplicate file ${file}"
  fi
done

Переменная только для чтения вверху позволяет передать путь к каталогу в качестве аргумента скрипту. По умолчанию используется текущий каталог, если аргумент не указан.

Он просто перебирает все файлы, оканчивающиеся на '.jpeg' в каталоге, указанном путем var. Затем он удаляет расширение и проверяет, существует ли такой же файл с расширением.jpg. Если дубликат.jpg существует, то файл.jpeg считается дубликатом и удаляется.

0
28.01.2020, 02:18

Текущие ответы отвечают на конкретный случай в теле вопроса, но в случае удаления всех других файлов я объединил ответ Стефана Шазела с этим ответом при исключении совпадений глобусов:

shopt -s extglob

for f in *.jpeg; do
  [ -e "$f" ] && echo rm -- "${f%.*}".!(jpeg)
done
0
03.02.2021, 12:54

Теги

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