Рекурсивно отредактируйте файлы на основе названия родительского каталога

Если Вы не используете VMs для особых целей (например, должен клонировать VMs; копия/перемещение между серверами; имейте несколько различных тестовых сред; и т.д.), я предложил бы установить Linux как основную ОС для Ваших 95% операций и затем установил бы окна как VM из Linux для Вашего 5%-го действия операций окон. (Если Вашими 5% действия окон не является чрезвычайно ЦП / интенсивно использующий память; как использование фотошопа или редактирования видео.), Если у Вас есть Linux как Ваша основная ОС, она будет иметь полный доступ ко всей Вашей памяти и всем Вашим ядрам CPU. Однако, если в VM можно только присвоить небольшую часть ядер процессора памяти к нему; обычно в лучшем случае половина ресурсов машины может быть присвоена VM. Таким образом, если Вы будете иметь четырехъядерную машину с 8 ГБ RAM, но только присвоите 1 ядро и 2 ГБ к Вашему VM, то производительность в VM для 95% материала значительно пострадает.

Используя VM будет медленнее. Для большей части материала виртуализация в наше время очень хороша, и различие не будет заметным (кроме значимого понижения доступных центральных процессоров/RAM к VM); однако, если Вы должны представить себе аппаратное ускорение (например, для графики), Ваш VM не может перевести в Вашу карту правильно; таким образом, можно заметить, что video/3-d рендеринг значительно страдает в VM.

1
06.04.2019, 04:35
3 ответа

Можно использовать эту команду:

for folder in $(ls); do
    for file in $(ls $folder); do
        sed -i 's/_b//' $folder/$file
    done
    mv $folder ${folder/_b/}
done
  • Первый цикл просматривает каталоги.
  • Второй цикл редактирует содержание файлов, расположенных в папках.

    После отъезда второго цикла сначала каждый переименовывает папки.

Иначе для контакта с пробелами в именах файлов, которые были бы интерпретированы как IFS:

ls | while read folder ; do
 ls "$folder" | while read file; do
  sed -i 's/_b//' "$folder/$file"
 done
 mv "$folder" "${folder/_b/}"
done
-1
27.01.2020, 23:54

Необходимо всегда стараться не анализировать вывод ls. Попробуйте это (благодаря stephane-chazelas для предложения ./*/):

for folder in ./*/; do     
      sed -i 's/_b//g' "$f"/*; mv "$folder" "${folder/_b/}"; 
 done
1
27.01.2020, 23:54
  • 1
    Парсинг вывода find имеет те же проблемы как парсинг вывода ls. Использовать -exec с находкой или просто циклом */: for folder in ./*/ –  Stéphane Chazelas 19.02.2013, 16:16
  • 2
    @StephaneChazelas находит, не имеет этих проблем при использовании в сочетании с IFS= и -print0 (который я забыл в своем исходном ответе. –  terdon♦ 19.02.2013, 18:14
  • 3
    Для -print0, Вам нужно read -d '' для которого Вам нужно zsh или bash. Отметьте for folder in ./*/ который я упомянул, ранее будет включать символьные ссылки на каталоги (желательно ли это или не) –  Stéphane Chazelas 19.02.2013, 19:26
  • 4
    @StephaneChazelas, да, я - a bash человек, верный. Почему Вам нужно -d для bash? Это, кажется, хорошо работает, как. –  terdon♦ 19.02.2013, 21:37

Пожалуйста

root@testbox:~# mkdir test
root@testbox:~# cd test
root@testbox:~/test# mkdir -p a_b_x{1..10} # populate directories
root@testbox:~/test# printf 'a_b_x\na_b_y\nfoo\nbar\n' | \
    tee a_b_x{1..10}/somefile # populate files
a_b_x
a_b_y
foo
bar

Переименуйте каталоги:

root@testbox:~/test# find . -name a_b_\* -type d -print0 | \
    xargs -r0 rename -v 's/a_b_/a_/'
./a_b_x10 renamed as ./a_x10
./a_b_x5 renamed as ./a_x5
./a_b_x7 renamed as ./a_x7
./a_b_x4 renamed as ./a_x4
./a_b_x8 renamed as ./a_x8
./a_b_x3 renamed as ./a_x3
./a_b_x9 renamed as ./a_x9
./a_b_x6 renamed as ./a_x6
./a_b_x1 renamed as ./a_x1
./a_b_x2 renamed as ./a_x2

Файлы редактирования:

root@testbox:~/test# find . ! -name \*.bak -type f -print0 | xargs -r0 sed -i.bak 's,a_b_,a_,'
root@testbox:~/test# cat a_x4/somefile
a_x
a_y
foo
bar

Удалите резервные копии если все хорошо:

root@vm8583:~/test# find . -name \*.bak -type f -delete
1
27.01.2020, 23:54
  • 1
    , спасибо за переименовывает в Perl не меньше! Это - часть установки Perl по умолчанию? –  terdon♦ 20.02.2013, 00:08
  • 2
    Это rename (prename) от установки жемчуга по умолчанию на Debian, то же может быть достигнуто с rename (rename.ul) от пакета util-linux с немного отличающимся синтаксисом вызова: rename.ul -v a_b_ a_ .... –  artyom 20.02.2013, 05:55

Теги

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