Як перемістити всі файли з поточного каталогу до верхнього каталогу в 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], чи щось подібне?