Видаліть підкреслення з усіх імен файлів у каталозі

У мене є папка "модель" з файлами з назвою:

a_EmployeeData
a_TableData
b_TestData
b_TestModel

Я в основному потрібно скинути підкреслення і зробити їх:

aEmployeeData
aTableData
bTestData
bTestModel

Чи є це в командному рядку Unix, щоб зробити це?

1
Вони не ... напевно.
додано Автор gran_profaci, джерело
Перейменувати файли будь ласка ...
додано Автор gran_profaci, джерело
Виберіть, що ви хочете зробити, якщо існують `foo_bar 'та' foobar '.
додано Автор Keith Thompson, джерело
Просто для уточнення, ви хочете перейменувати файли або просто роздрукувати назви файлів без підкреслення?
додано Автор doubleDown, джерело

7 Відповіді

Це правильно оброблятиме файли, що містять нечіткі символи, такі як пробіли або навіть нові рядки, і повинні працювати на будь-якому дистрибутиві Unix/Linux, який базується тільки на синтаксисі POSIX.

find model -type f -name "*_*" -exec sh -c 'd=$(dirname "$1"); mv "$1" "$d/$(basename "$1" | tr -d _)"' sh {} \;

Ось що він робить:

Для кожного файлу (а не каталогу), що містить підкреслення у своїй назві в каталозі моделі та його підкаталогах, перейменуйте файл на місце з усіма виділеними підкресленнями.

3
додано
@StephaneChazelas Ви (як майже завжди) правильно. Однак це, однак, кутові справи, які навряд чи можуть потрапити в ОР, тому, можливо, це не варто розглядати. Зокрема, проблема з назвою clash, здається, виключена в одному з коментарів gran_profaci.
додано Автор jlliagre, джерело
nitpick: він не працює для файлів у каталогах, назви яких закінчуються новими символами. Якщо пропустити -type f , вам потрібно додати -depth .
додано Автор Stephane Chazelas, джерело
Якщо у вас є файли ab , a_b і a__b , ви втратите два з них (або перемістіть a_b </<code> ab , якщо ab є каталогом. Ви можете додати -i до < code> mv (і додати параметр GNU-специфічний -T ) або перейти з zmv , що захищає це.
додано Автор Stephane Chazelas, джерело

Ви можете зробити це просто за допомогою bash .

for file in /path/to/model/*; do
mv "$file" "${file/_/}"
done

Якщо у вас є команда перейменування , просто виконайте це

rename 's/_//' /path/to/model/*
2
додано

можливо це:

find model -name "*_*" -type f -maxdepth 1 -print |  sed -e 'p;s/_//g' | xargs -n2 echo mv

Розклад:

  • find all plain files in the directory model what contains at least one underscore, and don't search subdirectories
  • with the sed make filename adjustments - replace the _ with nothing
  • also print the old name
  • fed the two filenames to xargs what will rename the files with mv

Вище це для сухого ходу. Задовольняючись, видаліть echo перед mv для фактичного перейменування.

Попередження: не буде працювати, якщо ім'я файлу містить пробіли. Якщо у вас є GNU sed , ви можете

find . -name "*_*" -maxdepth 1 -print0 |  sed -z 'p;s/_//g' | xargs -0 -n2 echo mv

і буде працювати з іменами файлів з пробілами теж ...

1
додано

У zsh:

autoload zmv # in ~/.zshrc
cd model && zmv '(**/)(*)' '$1${2//_}'
1
додано
for f in model/* ; do mv "$f" `echo "$f" | sed 's/_//g'` ; done

Редагування. Змінивши кілька речей, це було зроблено завдяки пропозиціям інших, але я боюся, що мій код все ще поганий для незнайомих імен файлів.

1
додано
ви можете використовувати для f в моделі/* - не потрібна марна модель ls
додано Автор jm666, джерело
небезпечно використовувати `ls model` , серед іншого, якщо імена файлів мають пробіли, це не спрацює правильно (я знаю, що приклад OP не має його, але ми повинні намагатися уникати таких сценаріїв, як це)
додано Автор doubleDown, джерело
[email protected]:~$ echo 'a_EmployeeData' | tr -d '_'
aEmployeeData
0
додано

У мене була така сама проблема на моїй машині, але імена файлів мали більше ніж одну підкреслення. Я використав перейменування з параметром g , щоб усі підкреслення були видалені:

find model/ -maxdepth 1 -type f | rename 's/_//g'

Або якщо немає підкаталогів, просто

rename 's/_//g'

Якщо у вас немає перейменування , перегляньте відповідь Jaypal Singh .

0
додано