Как переместить только файлы в Unix

18

Как я могу переместить только простые файлы (не каталоги) из одной папки в Linux в другую папку с помощью mvкоманды?

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

Скотт
источник
в ваших комментариях упоминается дополнительное ограничение: команда не должна перемещать скрытые файлы из текущего рабочего каталога. если это правильно, не могли бы вы отредактировать свой вопрос, чтобы упомянуть об этом? высказывание «перемещать только файлы» заставляет нас думать «перемещать все файлы», включая скрытые файлы.
шарлатан-кихот

Ответы:

29

Можешь попробовать

find . -maxdepth 1 -type f -exec mv {} destination_path \;
Mereghost
источник
2
Вау, кто-то, кто знает, как использовать найти. Для полноты вы должны использовать -name [^.] * В поиске, т.е. --- найти. -maxdepth 1 -тип f -name [^.] * -exec mv {} путь \;
Крис
НЕ КОПИРУЙТЕ ЭТОТ В ВАШУ ОБОЛОЧКУ. Точка с запятой заставит это выполнить немедленно. :)
Sherwood Callaway
@SherwoodCallaway Точка с запятой должна означать конец-exec
dstonek
4

Я вроде как "используй молоток для всего", поэтому я использую программы оболочки Bourne для вещей, которые другие используют для ...

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

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

YMMV, хотя ...

Крис
источник
спасибо за это попробую. но мне все еще нужен другой ответ, потому что это для проекта, который я делаю в курсе Linux. Большое спасибо
1
Это является ответом на ваш вопрос. У mv нет понимания файлов, каталогов, fifos или других специальных файлов. mv понимает только записи каталога и inode, и, насколько это касается, они одинаковы независимо от типа файла. Чтобы позволить mv перемещать только определенный тип файла, вам нужно что-то вроде test или find, которое может реально посмотреть на inode, чтобы увидеть, что это за файл. Другими словами, вам задают хитрый вопрос, если вас просят сделать это только с mv.
Крис
1
И я говорю, что mv понимает inode только потому, что он может перемещать файл из одной файловой системы в другую, которая технически представляет собой cp, а затем rm, а не mv (что на самом деле просто ln, а затем rm). Посмотрите жесткие ссылки и записи каталога.
Крис
2
shorty: Это хороший ответ, вы должны использовать что-то кроме команды mv (по крайней мере, shell). Это примерно так же, как и без программирования.
Кайл Брандт
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 \;
teancum144
источник
0

Если у вас нет папок с именем с точкой, вы можете просто переместить их все:

мв . ~ / destinationfolder

(Я предполагаю, что все ваши файлы являются чем-то. Что-то (в моем случае все обычно)

НО благодаря другим ответам - очень полезно. Спасибо

Shawor
источник
-1

вы можете использовать найти

find * -maxdepth 1 -type f -exec mv {} ~ \;
Джон Т
источник
да, это сработало, но не на 100% скопировало все файлы из каталогов и подкаталогов в ~ / location. Мне нужно что-то очень простое, которое копирует файлы без скрытых файлов из каталога, в котором я нахожусь, в другой каталог. Это оно. в любом случае спасибо за совет
Это невозможно с maxdepth как 1.
Джон Т
исправлено, поэтому он не будет копировать скрытые файлы.
Джон Т
1
Синтаксис find - найти каталог, затем описание операций и объектов для сопоставления. Как правило, никто бы никогда не использовал подстановочный знак, такой как find *, не защищая его от сбоев (например, find / path / to / directory -name goo * -type f.
chris
1
Поиск работает только правильно, если вы передадите ему единственный путь для изучения. Например, в вашем примере, если есть какие-либо файлы, начинающиеся с - find неожиданно взорвется. Вам всегда намного лучше, если только одна программа выполняет чтение записей каталога, и в вашем примере вы используете две разные программы (find и shell).
Крис
-2

mv `find ./sourcedir/* -type f` ./destdir

Cm57201
источник
2
Это не удастся для любых файлов, которые содержат пробелы в своем имени. Выходные данные команд, которые печатают имена файлов, никогда не должны анализироваться, если не гарантируется, что они правильно разграничены. Посмотрите, почему вы не должны анализировать вывод ls (1) для основной идеи. Использование find«s -execварианта является лучшим способом избежать этой проблемы.
Slhck