Як перемістити всі файли з поточного каталогу до верхнього каталогу в Linux?
Я спробував щось подібне mv *.*
, але це не виходить.
Як перемістити всі файли з поточного каталогу до верхнього каталогу в Linux?
Я спробував щось подібне mv *.*
, але це не виходить.
Відповіді:
Команда, яку ви шукаєте, така
mv * .[^.]* ..
або (див. нижче для отримання додаткової інформації):
(shopt -s dotglob; mv -- * ..)
Пояснення: mv
команда переміщує файли та каталоги. Останній аргумент mv
- це ціль (у цьому випадку каталог один крок "вгору" в дереві, ..
). Аргументи до цього - це вихідні файли та каталоги. Зірочка ( *
) - це майна, яка відповідає всім файлам, які не починаються з крапки. Файли, які починаються з крапки (dotfiles), "приховані". Вони узгоджуються за допомогою шаблону .[^.]*
(див. Редагування нижче).
Для отримання додаткової інформації дивіться сторінку, яку я пов’язав mv
.
.[^.]*
замість .*
?Як правильно зазначає Кріс Джонсен : модель .*
також відповідає .
і ..
. Оскільки ви не хочете (і не можете) їх переміщувати, краще використовувати шаблон, який відповідає будь-якому імені файлу, починаючи з крапки, крім цих двох . Шаблон .[^.]*
робиться саме так: він відповідає будь-якому імені файлу (1), починаючи з крапки (2), а потім символу, який не є крапкою (3), а за нулем або більше довільних символів.
Як Paggas вказує , ми також повинні додати шаблон .??*
, щоб відповідати файли , що починаються з двох точок. Дивіться його відповідь щодо використання альтернативного рішення find
.
У відповіді Ар'яна згадується shopt
, щоб уникнути всіх цих питань з точковими файлами. Але тоді проблема з файлами починається з тире. А для цього потрібні три команди. Все-таки ідея мені подобається. Я пропоную використовувати його так:
(shopt -s dotglob; mv -- * ..)
Це виконується shopt
в підрозділі (таким чином, не shopt
вимагається другий виклик ) і використовує --
так, що файли, що починаються з тире, не трактуватимуться як аргументи mv
.
.*
може викликати mv для створення попереджень / помилок про неможливість переміщення .
та ..
. Ви можете спробувати mv * .[^.]* ..
.
*
, .[^.]*
і ..?*
. Другий, можливо, .[!.]*
для старих (POSIX) снарядів. Читайте також
Коротка відповідь: використання
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Довга відповідь:
Команда
mv * .* ..
не працюватиме, оскільки .*
може відповідати .
і ..
. Але команда
mv * .[^.]* ..
також не працюватиме, оскільки .[^.]*
не збігається, наприклад ..filename
,! Натомість те, що я роблю, - це
mv * .[^.] .??* ..
який буде відповідати всьому, окрім .
і ..
. *
буде відповідати всьому, що не починається з символу " a" .
, .[^.]
відповідатиме всім файлам 2 символів, починаючи з крапки, за винятком крапки ..
, і .??*
буде відповідати всім назви файлів, починаючи з крапки з принаймні 3 символами
А ще краще, ви можете використовувати
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
що дозволяє уникнути некрасивих глобальних хакерів mv * .[^.] .??* ..
!
..?*
свій коментар, і ви вже подбали про це.
mv
щоб перестати шукати будь-які подальші варіанти команд. Дужки - це отримане ім'я файлу. Знак плюс говорить, що замість запуску exec за результатом (тобто за назвою файлу), покладіть якомога більше результатів в один виконавець, наскільки це можливо. Для повноти, -t..
означає перемістити цільове місце призначення, щоб перемістити всі ці файли до.
Тільки задля повноти можна також сказати оболонці Bash включати приховані файли, використовуючи shopt
:
shopt -s dotglob
mv -- * ..
shopt -u dotglob
У телевізора бракує функціональних можливостей переміщення прихованих файлів при використанні *
- так чому б не використовувати копію замість цього?
cp -rf . ..
rm -rf *
Не потрібно вникати в складні рішення дотглобінгу та використовувати команди пошуку.
rsync -a --remove-source-files . ..
rsync
це надзвичайно потужний інструмент копіювання файлів, який зазвичай використовується для виконання ефективних віддалених резервних копій та дзеркал.
За допомогою наведеної вище команди ми rsync
хочемо скопіювати вміст .
у..
Перемикач -a
дає можливість рекурсії в .
підкаталоги та дає змогу використовувати деякі інші загальні параметри.
Перемикач --remove-source-files
повідомляє rsync видалити вихідні файли після успішної копії, тобто змушує rsync вести себе аналогічно mv
команді.
--remove-source-files
не буде видалено (синхронізовано) каталоги.
-bash: /bin/mv: Argument list too long
помилку. Цей працює як принадність.
Зрештою, спроба mv .
не вдасться, тому що mv не зможе від’єднати каталог, у якому ви зараз перебуваєте. Ви можете mv * ..
перемістити файли в cwd.
mv * .??* ../.
*
отримує всі неточні файли. .??*
отримує все. файли принаймні три байти, що працює для всіх законних. Все, що ви залишили, напевно, хочете, rm
а не mv
все одно.
../.
Не дає ніяких прямих переваг по порівнянні , ..
але при виконанні крок-в-каталог це дуже хороша звичка, тому що вона НЕ буде виконана, як ви хочете, якщо є що - то не так зі шляху. Наприклад, mv xyz bletch
там, де ви думаєте bletch
, що це каталог, можна зробити більш впевненим mv xyz bletch/.
.
.[^.]
щоб отримати схожі файли .a
.
Ця мінімізована команда працює на більшості сучасних оболонок:
\mv -- {,.{[^.],??}}* ..
В іншому випадку є портативне рішення:
\mv -- * .[^.] .??* ..
Особливості:
\ заважає псевдонімам не бажано змінювати mv.
- запобігає інтерпретації назви файлів, що містять провідні дефіси (-xyz), як аргументи командного рядка.
. [^.] відповідає всім двом іменам символів, починаючи з. крім ..
. ?? * відповідає всім іншим іменам три символи або довше.
Наївні втілення:
Наступні пропускає приховані імена файлів UNIX, ті, що починаються з. (.bashrc).
mv * ..
Наступні збіги .., які рекурсивно намагаються перемістити кожен каталог, врешті-решт, назад до / в .. поточного робочого каталогу ($ PWD або pwd). Ніколи не використовуйте.
mv .* ..
Правильніше використовувати шаблон, * .[!.] .??*
ніж * .[^.] .??*
коли перша також буде працювати зі старими оболонками, такими як ksh88:
mv -- * .[!.] .??* ..
--
запобігає проблемам, коли у вас є ім'я файлу, з якого починається -
*
відповідає всім іменам файлів, які не починаються з .
.
який ви можете / повинні перемістити.[!.]
відповідає всім двом іменам файлів символів, які починаються з .
.??*
відповідає усім трьом іменам файлів символів (або довше), які починаються з a .
Що стосується ksh88, шаблон імені файлів .[^.]
насправді буде відповідати назвам файлів ..
(які завжди існують) та .^
(які, ймовірно, не існують), матиме ефект, протилежний бажаному.
Знайдіть і виконайте роботу теж. Така структура може бути корисною, якщо ви хочете вибрати файли за складнішими критеріями, змінивши find і egrep.
find -maxdepth 1 | egrep '^./.' # Returns all files
mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..
Я думаю, що найпростіше рішення для переміщення всіх файлів у його батьківський dir. був би
mv "`ls`" ../
або, якщо є приховані файли / каталоги
використання:
mv "`ls -a`" ../ 2>/dev/null
Крім того, скажемо, що ви хочете перемістити вміст якоїсь папки в одну з її внутрішньої папки (скажіть)
використання:
mv "`ls -a`" /tony 2>/dev/null
Примітка:
"`ls -a`"
Переміщення файлів із пробілами.
2>/dev/null
Є чи для придушення попередження / помилки , тому що ls -a
буде друкувати .
і ..
папки , а також і ви не можете переміщати або копіювати їх. Так що для цих папок буде показано помилку (якщо ми не використовуємо 2> / dev / null), що вона не може їх перемістити, а решта буде зручно переміщуватись.
Краще уникати, ls -a
якщо немає прихованих файлів, а просто використовувати ls
.
mv $(ls -a)
? Це торкнеться поточного каталогу та каталогу під ним, тому що також ls -a
буде видаватися ..
.
mv ls -a ../
він також працював би за потребою. Так, він покаже ті помилки, як я згадував вище, але крім того, що він перемістить необхідні папки / файли до батьківського dir.
ls
команду для переміщення файлів з пробілами. Я вніс необхідні зміни. Дякуємо, що вказали.
[linux] [mv] [cwd] [files]
, чи щось подібне?