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
for f in *.jpeg; do
[ -e "${f%.*}.jpg" ] && echo rm -- "$f"
done
(удалить echo
если счастлив ).
С zsh
и одним rm
вызовом:
echo rm -- *.jpeg(e'{[ -e $REPLY:r.jpg ]}')
(измените *
на **/*
, чтобы сделать это рекурсивно, добавьте квалификатор D
glob, если вы также хотите учитывать скрытые файлы или файлы в скрытых каталогах ).
Адаптация ответа на аналогичный вопрос:
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 {} +
(Вы заметите, что это оказалось рекурсивной вариацией ответа Стефана Шазела)
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 считается дубликатом и удаляется.
Текущие ответы отвечают на конкретный случай в теле вопроса, но в случае удаления всех других файлов я объединил ответ Стефана Шазела с этим ответом при исключении совпадений глобусов:
shopt -s extglob
for f in *.jpeg; do
[ -e "$f" ] && echo rm -- "${f%.*}".!(jpeg)
done