Я не должен перемещать папки, только файлы.
Я попробовал mv *
но эта команда перемещает папки также.
Я думаю, что Вы хотите к mv только свои файлы. Сначала перейдите к своему каталогу и используйте эту команду, замените $TARGET своим целевым путем к каталогу. Если Вы хотите скопировать свою замену файлов mv
с cp
.
find . -type f -exec mv {} $TARGET \;
, если я объясняю это, find . -type f
, средства выбирают все файлы и -exec mv {} $TARGET \;
, средства выполняются mv
команда ко всем выбранным пунктам.
Предыдущий ответ имеет ошибку.. это mv
все файлы в подкаталогах также. Быстрое исправление является использованием -maxdepth 1
. Затем это не рекурсивно mv
файлы в подкаталогах. Ниже корректный..
find . -maxdepth 1 -type f -exec mv {} $TARGET \;
При использовании zsh вместо удара можно сделать это:
mv "$SOURCE"/*(.) "$TARGET"
(.)
в конце назван спецификатором шарика; .
внутренняя часть конкретно означает только соответствовать регулярным файлам.
Выполнение mv *(.) "$target"
быстро и практично. Однако при выполнении этого как части сценария Вы могли бы хотеть рассмотреть вместо этого запись чего-то как то, что Frxstrem и предложенный David Forester, mv -t "$target" -- *(.)
, для лучше обработки угловых случаев, которые могли бы возникнуть в использовании других людей.
Я использовал бы
mv *.*
, это будет работать, пока Ваши папки не имеют расширений.
Если Вы хотите переместить все кроме каталогов от $SOURCE_DIR
кому: $TARGET_DIR
, можно использовать эту команду:
find "$SOURCE_DIR" -maxdepth 1 -not -type d -exec mv -t "$TARGET_DIR" -- '{}' +
Объясненный подробно:
find
: Поиск находки файлов в каталоге$SOURCE_DIR
: Каталог для поиска в-maxdepth 1
: Не смотрите в подкаталогах-not -type d
: Проигнорируйте каталоги -type f
если Вы только хотите скопировать вещи, которые являются строго файлами, но я предпочитаю вышеупомянутое, потому что оно также ловит все, что это ни файл, ни каталог (в особенности символьные ссылки)-exec mv -t "$TARGET_DIR" -- '{}' +
: Выполните команду mv -t "$TARGET_DIR" -- FILES...
где FILES...
все файлы соответствия (благодарит @DavidFoerster),При контакте с файлами рекурсивно, find
путь состоит в том, чтобы пойти. В данном случае это не необходимо, но может использоваться с -maxdepth 1
как другое шоу ответов.
Простая команда Python может сделать это также. Вот пример:
$ tree
.
├── a_directory
└── a_file
$ python -c "import os,shutil;fl=[f for f in os.listdir('.') if os.path.isfile(f)];
> map(lambda x:shutil.move(x,'./a_directory'),fl)"
$ tree
.
└── a_directory
└── a_file
1 directory, 1 file
fl=[f for f in os.listdir('.') if os.path.isfile(f)]
выполняет итерации по всем объектам этого os.listdir('.')
находит и мы тестируем, является ли объект использованием файла os.path.isfile()
функция.
Однажды fl
список файлов создается, мы используем map()
функция. Эта функция берет два аргумента - функция и список объектов; это выполнит функцию, что мы дали его на каждый файл в списке. Таким образом здесь мы имеемlambda x:shutil.move(x,'./a_directory')
как анонимная функция, которая переместит данный файл в данный каталог и затем мы имеем fl
- список файлов, которые мы создали.
Для удобочитаемости и общего использования, мы могли также переписать это как общий сценарий Python, который берет два аргумента - исходный каталог и целевой подкаталог.
#!/usr/bin/env python3
from os import listdir
from os.path import isfile,realpath
from os.path import join as joinpath
from shutil import move
from sys import argv
# this is script's full path
script=realpath(__file__)
# get all items in a given directory as list of full paths
fl=[ joinpath(argv[1],f) for f in listdir(argv[1]) ]
# filter out script itself ( just in case) and directories
fl_filtered = [ f for f in fl if isfile(f) and not script == realpath(f) ]
# Uncomment this in case you want to see the list of files to be moved
# print(fl_filtered)
# move the list of files to the given destination
for i in fl_filtered:
move(i,argv[2])
И использование похоже так:
$ tree
.
├── a_directory
├── a_file
└── files2subdir.py
1 directory, 2 files
# Notice: the script produces no output unless you uncomment print statement
$ ./files2subdir.py "." "./a_directory"
$ tree
.
├── a_directory
│ └── a_file
└── files2subdir.py
Перемещать все кроме каталогов от source-dir
каталог к destination-dir
каталог, в Python:
#!/usr/bin/env python3
"""Usage: mv-files <source-dir> <destination-dir>"""
import shutil
import sys
from pathlib import Path
if len(sys.argv) != 3:
sys.exit(__doc__) # print usage & exit 1
src_dir, dest_dir = map(Path, sys.argv[1:])
for path in src_dir.iterdir():
if not path.is_dir():
shutil.move(str(path), str(dest_dir / path.name))
Посмотрите рабочий файл Python в терминале.