2015-08-08 4 views
-4

Я папка содержит файлы, такие какУдалить файлы с уникальным базовым именем?

a.JPG 
a.GIF 
b.JPG 
c.JPG 
c.GIF 
d.GIF 

В файлах b.JPG и d.GIF имеет только одно вхождение в базовом имени части имени файла, поэтому я хочу, чтобы удалить b.JPG и d.GIF, как сделать это в Баше?

+0

принять Пожалуйста, посмотрите на: [Что я должен делать, когда кто-то ответит на мой вопрос?] (HTTP: //stackoverflow.com/help/someone-answers) – Cyrus

ответ

1

Это разумная процедура:

1.- без кавычек * будет список всех файлов: цикл над ними.

2.- можно удалить заднее расширение с ${myfile%.*}

3.- расширяемого имя звездочка name.* (точкой, чтобы обеспечить конец имени).

4.- И захватить результат в массиве: "tocount = (...)"

5.- Наконец, если счетчик массива 1, удалите файл.

И код:

for myfile in *; do 
    tocount=("${myfile%.*}".*) 
    [[ ${#tocount[@]} -eq 1 ]] && rm "$myfile" 
done 
+0

@glennjackman Спасибо за ваше редактирование. Я добавляю полезную точку, чтобы избежать таких файлов, как «c d.GIF» и «c.GIF», «захватывается расширением' »$ {myfile%. *}" * '. –

0

Используйте ассоциативный массив в Баш версии 4

declare -A count 
# count each root-name 
for f in *; do 
    ((count["${f%.*}"] ++)) 
done 
# delete the files with count 1 
for key in "${!count[@]}"; do 
    if ((${count["$key"]} == 1)); then 
     rm "$key"* 
    fi 
done 
Смежные вопросы