Как перемещать только файлы в текущей папке в подпапку?

9

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

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

    
задан Archit 01.04.2017 в 10:22
источник

6 ответов

12

Если вы хотите переместить все, кроме каталогов, от $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)
ответ дан Frxstrem 01.04.2017 в 10:29
5

Я думаю, что вы хотите 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 \;
    
ответ дан Emalsha Rasad 01.04.2017 в 11:08
3

Подход 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
    
ответ дан Sergiy Kolodyazhnyy 01.04.2017 в 14:44
3

Если вы используете zsh вместо bash, вы можете сделать это:

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

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

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

    
ответ дан JoL 01.04.2017 в 16:32
2

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

    
ответ дан jfs 02.04.2017 в 04:52
0

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

mv *.*

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

    
ответ дан user669400 16.06.2017 в 18:29