Как переместить Только файлы в текущую папку к sub папке?

Я не должен перемещать папки, только файлы.

Я попробовал mv * но эта команда перемещает папки также.

9
задан 1 April 2017 в 08:25

6 ответов

Я думаю, что Вы хотите к 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 \;
5
ответ дан 23 November 2019 в 04:46

При использовании zsh вместо удара можно сделать это:

mv "$SOURCE"/*(.) "$TARGET"

(.) в конце назван спецификатором шарика; . внутренняя часть конкретно означает только соответствовать регулярным файлам.

Выполнение mv *(.) "$target" быстро и практично. Однако при выполнении этого как части сценария Вы могли бы хотеть рассмотреть вместо этого запись чего-то как то, что Frxstrem и предложенный David Forester, mv -t "$target" -- *(.), для лучше обработки угловых случаев, которые могли бы возникнуть в использовании других людей.

3
ответ дан 23 November 2019 в 04:46

Я использовал бы

mv *.*

, это будет работать, пока Ваши папки не имеют расширений.

0
ответ дан 23 November 2019 в 04:46

Если Вы хотите переместить все кроме каталогов от $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),
13
ответ дан 23 November 2019 в 04:46

Подход Python

При контакте с файлами рекурсивно, 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
3
ответ дан 23 November 2019 в 04:46

Перемещать все кроме каталогов от 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 в терминале.

2
ответ дан 23 November 2019 в 04:46

Другие вопросы по тегам:

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