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

26396
Scott

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

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

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

5 ответов на вопрос

24
Mereghost

Ты можешь попробовать

find . -maxdepth 1 -type f -exec mv {} destination_path \; 
Вау, кто-то, кто знает, как использовать найти. Для полноты вы должны использовать -name [^.] \ * В поиске, т.е. --- найти. -maxdepth 1 -тип f -name [^.] \ * -exec mv {} путь \; chris 15 лет назад 2
5
chris

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

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

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

YMMV, хотя ...

спасибо за это попробую. но мне все еще нужен другой ответ, потому что это для проекта, который я делаю в курсе Linux. большое спасибо 15 лет назад 0
Это * ответ * на ваш вопрос. У mv нет понимания файлов, каталогов, fifos или других специальных файлов. mv понимает только записи каталога и inode, и, насколько это касается, они одинаковы независимо от типа файла. Чтобы позволить mv перемещать только определенный тип файла, вам нужно что-то вроде test или find, которое может реально посмотреть на inode, чтобы увидеть, что это за файл. Другими словами, вам задают хитрый вопрос, если вас просят сделать это * только * с mv. chris 15 лет назад 1
И я говорю, что mv понимает inode * только *, потому что он может перемещать файл из одной файловой системы в другую, которая технически является cp, а затем rm, а не mv (что на самом деле просто ln, а затем rm). Посмотрите жесткие ссылки и записи каталога. chris 15 лет назад 1
shorty: This is a good answer, you have to using something besides the mv command (at least the shell). This is about a basic as it gets without programming. Kyle Brandt 15 лет назад 2
2
teancum144

@Mereghost is very close. Here's what I get to move all files (including hidden files), but not directories:

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

The . after find assumes you current directory is the source of the files you want to move. If not, the command can be revised, as follows:

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

If you want to move only regular files and not hidden files:

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

If you want to move only hidden files and not regular files:

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

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

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

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

Это не удастся для любых файлов, которые содержат пробелы в своем имени. Выходные данные команд, которые печатают имена файлов, никогда не должны анализироваться, если не гарантируется, что они правильно разграничены. См. [Почему вы не должны анализировать вывод ls (1)] (http://mywiki.wooledge.org/ParsingLs) для основной идеи. Использование `find`` -exec` - лучший способ избежать этой проблемы. slhck 11 лет назад 2

Похожие вопросы