Як переміщувати лише файли в Unix


18

Як я можу переміщувати лише прості файли (а не каталоги) з однієї папки в Linux до іншої папки за допомогою mvкоманди?

Я спробував mv * ~/, але він скопіював все, включаючи каталоги.


ваші коментарі згадують додаткове обмеження: команда не повинна переміщувати приховані файли з поточної робочої каталоги. якщо це правильно, чи можете ви відредагувати своє питання, щоб згадати про це? кажучи, що "перемістити лише файли", змушує задуматися "перемістити всі файли", що включає приховані файли.
квахтіт кіхот

Відповіді:


29

Ви можете спробувати

find . -maxdepth 1 -type f -exec mv {} destination_path \;

2
Нічого собі, хтось, хто вміє користуватися знахідкою. Для повноти слід використовувати -name [^.] * У знаходженні, тобто --- знайти. -maxdepth 1 -тип f -name [^.] * -exec mv {} шлях \;
chris

НЕ КОПУЙТЕ-ВКЛЮЧИТИ ЦЕ В СВОЮ ШКІЛЬКУ. Точка з комою призведе до негайного виконання. :)
Sherwood Callaway

@SherwoodCallaway Крапкою з комою є позначка кінця-exec
dstonek

4

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

for file in * .* 
do
  test -f "$file" && mv "$file" "$HOME"/
done

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

YMMV, хоча ...


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

1
Це є відповіддю на ваше запитання. mv не має розуміння файлів чи каталогів, файлів або інших спеціальних файлів. mv розуміє лише записи каталогів та індекси, і що стосується цього, вони однакові, незалежно від типу файлу. Щоб дозволити mv переміщати лише певний тип файлів, вам потрібно щось на зразок тесту або знайти, що може насправді подивитися на inode, щоб побачити, що це за файл. Іншими словами, вам задають хитромудрий запитання, якщо вас просять зробити це лише з mv.
chris

1
І я кажу, що mv розуміє inode лише тому, що він здатний переміщувати файл з однієї файлової системи в іншу, яка технічно є cp, то rm, а не mv (що насправді є лише ln тоді rm). Перегляньте тверді посилання та записи каталогів.
chris

2
короткий: Це хороша відповідь, вам доведеться використовувати щось, крім команди mv (принаймні оболонки). Йдеться про основне, що виходить без програмування.
Кайл Брандт

3

@Mereghost дуже близький. Ось що я можу перемістити всі файли (включаючи приховані файли), але не каталоги:

find . -maxdepth 1 -type f -name '*' -exec mv -n {} /destination_path \;

.Після того, як знахідка припускає , що ви поточний каталог є джерелом файлів , які ви хочете перемістити. Якщо ні, команда може бути переглянута так:

find /source_path -maxdepth 1 -type f -name '*' -exec mv -n {} /dest_path \;

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

find . -maxdepth 1 -type f -name '[!.]*' -exec mv -n {} /dest_path \;

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

find . -maxdepth 1 -type f -name '.*' -exec mv -n {} /dest_path \;

0

Якщо у вас немає папок з назвою з крапкою, ви можете перемістити їх усі:

mv . ~ / папка призначення

(Моє припущення, що всі ваші файли - це щось. Щось (у моєму випадку, як правило, все))

АЛЕ завдяки іншим відповідям - дуже корисно. Дякую


-1

ви можете використовувати find

find * -maxdepth 1 -type f -exec mv {} ~ \;

так добре, що працювало, але не на 100%, він копіював усі файли з каталогів та підкаталогів у ~ / location. Мені потрібно просто щось дуже базове, яке копіює файли без прихованих файлів з режиму, в якому я перебуваю в інший реж. Це воно. дякую за пораду в будь-якому випадку

Це неможливо з maxdepth як 1.
Іван T

виправлено, щоб він не копіював приховані файли.
Джон Т

1
Синтаксис знахідки - це знайти потім каталог, а потім опис операцій та речей, які відповідають. Як правило, ніколи не використовуватимете підстановку, таку як find *, не захищаючи її від глобування (тобто find / path / to / directory -name goo * -type f.
chris

1
Знайдіть, що працює належним чином, лише якщо ви подасте єдиний шлях для вивчення. Наприклад, у вашому прикладі, якщо є файли, які починаються з -, пошук несподівано вибухне. Вам завжди набагато краще мати лише одну програму читання запису в каталозі, і у вашому прикладі ви ніби використовуєте дві різні програми (find and shell).
chris

-2

mv `знайти ./sourcedir/* -тип f` ./destdir


2
Це не вдасться до файлів, що містять пробіли у своєму імені. Виведення команд, які друкують імена файлів, ніколи не слід аналізувати, якщо не можна гарантувати, що воно належним чином розмежоване. Див. Чому не слід розбирати вихід ls (1) для основної ідеї. Використання find«s -execваріанту є найкращим способом уникнути цієї проблеми.
slhck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.