1

У меня есть следующие две строки в сценарии оболочки, и мне было интересно, есть ли способ сжать их в одну, используя sed. Я не уверен, есть ли подстановочный знак или что-то, что могло бы заменить слова Glitch и Chill в них, но если есть, я хотел бы знать. Все, что действительно важно, - это то, что он удаляет все в странных скобках, которые вы видите, и больше ничего не трогаете.

find . -type f -name '【Chill*' -execdir bash -c 'for file in "$@"; do new=$(echo "$file" | sed -r 's/【Chill.*】//'); mv -v "$file" "$new"; done' _ {} +  
find . -type f -name '【Glitch*' -execdir bash -c 'for file in "$@"; do new=$(echo "$file" | sed -r 's/【Glitch.*】//'); mv -v "$file" "$new"; done' _ {} +

3 ответа3

1

Знаете ли вы, что вы можете сделать все, используя переименование Perl:

$ rename -n 's:【Chill.*】|【Glitch.*】::' 【Chill* 【Glitch*
【Chillxx】file1.ext  renamed as file1.ext
【Chillyy】file2.ext  renamed as file2.ext
【Glitchxx】file3.ext renamed as file3.ext
【Glitchyy】file4.ext renamed as file4.ext
1
find . -type f -name '【Chill*' -o -name '【Glitch*' -execdir bash -c 
'for file in "$@"; do 
   new=$(echo "$file" | sed -r 's/【Chill.*】\|【Glitch.*】//');
   mv -v "$file" "$new";
 done' _ {} +
0

Ответ @Cyrus это хорошо, но было бы еще лучше без sed и упрощены for цикла:

find . -type f -name '【Chill*' -o -name '【Glitch*' -execdir bash -c 
'for file; do 
   new=${file/【Chill*】/};
   new=${new/【Glitch*】/};
   mv -v "$file" "$new";
 done' _ {} +

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