Невозможно безопасно конвертировать dot-файлы в файлы без точек - PullRequest
2 голосов
/ 27 мая 2009

Я неудачно запускаюсь в Mac

mv .* *

и

mv .* ./*

Мои файлы растворились в воздухе.

Как безопасно конвертировать точечные файлы в файлы без точек?

Ответы [ 6 ]

7 голосов
/ 27 мая 2009
for i in `ls -d .*`; do mv $i "`echo $i | sed 's/^.//'`"; done

или, что намного проще,

rename 's/^.//' `ls -d .*`

если ваша система его получила.

В zsh вы можете просто использовать. * Безопасно, но в bash вам придется использовать ls -d .*

4 голосов
/ 27 мая 2009

Вы не можете использовать mv для переименования нескольких файлов. То, что вы хотите, это ммв (получите здесь ).

mmv .\* \#1

Вы должны экранировать звездочку, чтобы предотвратить ее расширение. Используйте флаг -n, чтобы выполнить тестовый запуск, чтобы убедиться, что то, что произойдет, именно то, что вам нужно.

Вы также можете сделать это в сценариях оболочки, но я очень предпочитаю mmv, потому что флаг -n показывает, что он будет делать. Вам придется изменить свой сценарий на echo вместо mv, что кажется более опасным, чем сброс флага -n (особенно, когда вы усложняетесь.

2 голосов
/ 27 мая 2009

Самое сложное в этом - выбор файлов точек без выбора "." и "..".

  • ls .??* иногда используется для этого, так как это заставляет имена файлов быть длиной три или более символов. Однако существует риск пропустить точечный файл с коротким именем, например, ".x"
  • ls -d .* предотвращает расширение каталогов, но не отфильтровывает "." или ".."
  • Можно использовать команду find, как в find . -maxdepth 1 -type f -name '.*'. Maxdepth ограничивает его текущим каталогом, а не подкаталогами. -Type f ограничивает его файлами, исключая такие каталоги, как "." а также "..". Опять же, может быть, вы хотите переименовать каталог .ssh в ssh.

Вот альтернатива, которая выбирает точечные файлы, избегая "." и "..".

ls -A | sed -n 's/^\.\(.*\)/mv ".\1" "\1"/p' | bash

-A перечисляет все файлы и точечные файлы, но исключает "." и для нас. Затем команда sed выбирает только те строки, которые имеют "." в качестве первого символа и выводит соответствующие команды "mv", дополненные кавычками на случай, если у вас есть причудливое имя файла точек с пробелом в нем.

Сначала запустите его без "| bash", чтобы увидеть, какие команды mv генерируются.

1 голос
/ 27 мая 2009

В Linux обычно доступна утилита rename (Perl-скрипт, если я не ошибаюсь):

rename 's/^.//' .*

Доступно на Mac. Вы можете установить его, следуя советам на здесь .

1 голос
/ 27 мая 2009

Я не знаю, какой тип системы вы используете, но похоже на Unix, я бы сделал

ls -1.? * | вырезать -b1- | xargs -i {} mv. {} {}

это список, все, что начинается с., Но не. или .., затем обрежьте первый столбец, затем передайте этот список команде перемещения

0 голосов
/ 02 августа 2010

Еще проще:


for x in .*; do mv $x ${x/./}; done    

...