Як рекурсивно переміщувати всі файли (включаючи приховані) у підпапках у батьківську папку в * nix?


14

Це трохи неприємне питання, але я мушу визнати, що в кінці своєї кар’єри у мене все ще є питання щодо команди mv.

У мене часто виникає така проблема: мені потрібно переміщувати всі файли рекурсивно вгору на один рівень. Скажімо, у мене є папка foo та панель папок всередині неї. У бар є безлад файлів і папок, включаючи крапкові файли та папки. Як перенести все в барі на рівень foo?

Якщо foo порожній, я просто переміщую смугу на один рівень вище, видаляю foo та перейменую рядок у foo. Частина проблеми полягає в тому, що я не можу зрозуміти, що означає підстановочний код для "всього, включаючи крапки". Частина цього питання полягає в цьому - чи існує поглиблене обговорення підстановок, які команди cp та mv використовують десь (гуглінг це лише приносить дуже основні підручники).

Відповіді:


19

У Bash (та деяких інших) ви можете використовувати розширення дужок, щоб досягти цього в одному рядку:

mv bar/{,.}* .

Кома розділяє нуль і крапку, тому mvкоманда бачить назви файлів, які відповідають *і.*


ця спроба перемістити ".." теж не вдається з повідомленням "ресурс зайнятий". Тим не менш, працює.
Ксанакс

3
Запропоновано анонімним користувачем:To eliminate the error caused by also matching "." and "..", use this command: mv bar/{,.[!.],..?}* .
HopelessN00b

2

Найпростіший спосіб зробити це - це зробити в двох командах, тому що * не відповідає

cd /foo
mv bar/* ./
mv bar/.??* ./

Ви не хочете використовувати бар /.*, який я з’ясував під час вчинення цієї помилки:

rm -rf ./.* 

Це ДУХА ЧАС. Хтось хоче здогадатися, чому? ;-)


Я не думаю, що Bash або Zsh розширюються .*до .і ... Zsh не принаймні для мене.
Mikael S

Мікаел: Я можу пообіцяти, що баш це робить (або принаймні зробив), оскільки мені довелося відновити каталоги користувачів, які я видалив, зробивши саме це
Метт Сіммонс

2

Перше, що потрібно знати про глобалізацію - це робиться оболонкою, а не командою. Перегляньте сторінку чоловічої оболонки на всі деталі.


2

Цей файл збирає всі файли з папок і переміщує їх до поточного режиму

find . -type f -exec mv -iv \{} . \;

Якщо ви хочете приписати файли з одним іменем, використовуйте

yes y | find . -type f -exec mv -iv \{} . \;

1

mv .??* *подбає про все, крім крапки, за якою піде один символ. Якщо це характерно для вашої ситуації, ви можете додати .[a-zA-Z0-9]*. Це буде по- як і раніше залишити файли з такими іменами, як .;, .^і .^I(вкладка). Якщо вам потрібно впоратися з усім, вам потрібно буде трохи складніше.

mv .. `ls -f | egrep -v '^.$|^..$'

0

Якщо у вас є структура каталогу /foo/bar/і ви хочете перемістити всі файли на barодин крок вище, перейдіть до barкаталогу та введіть наступне:

find . -depth -print0 | cpio --null -pvd ../

Взагалі, я вважаю cpio(1), що для таких завдань краще. Ви можете ознайомитись з детальною документацією, видавши info cpioв оболонці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.