Перемещение файлов, начиная с буквы в PowerShell, Python или другой язык сценариев под управлением Windows - PullRequest
2 голосов
/ 30 апреля 2011

Мне нужен скрипт, который может рекурсивно пройти c: \ somedir \ и переместить файлы в c: \ someotherdir \ x \ - где x - начальная буква файла.

Кто-нибудь может помочь?


Заканчивается на этом:

import os
from shutil import copy2
import uuid
import random

SOURCE = ".\\pictures\\"
DEST = ".\\pictures_ordered\\"

for path, dirs, files in os.walk(SOURCE):
    for f in files:
        print(f)
        starting_letter = f[0].upper()
        source_path = os.path.join(path, f)
        dest_path = os.path.join(DEST, starting_letter)

        if not os.path.isdir(dest_path):
            os.makedirs(dest_path)

        dest_fullfile = os.path.join(dest_path, f)

        if os.path.exists(dest_fullfile):            
            periodIndex = source_path.rfind(".")
            renamed_soruce_path = source_path[:periodIndex] + "_" + str(random.randint(100000, 999999))  + source_path[periodIndex:]
            os.rename(source_path, renamed_soruce_path)
            copy2(renamed_soruce_path, dest_path)            
            os.remove(renamed_soruce_path)
        else:
            copy2(source_path, dest_path)
            os.remove(source_path)`

Ответы [ 5 ]

3 голосов
/ 01 мая 2011

Вот простой скрипт, который делает то, что вы хотите.Он ничего не говорит вам о том, что он делает, и просто перезапишет старый файл, если есть два файла с одинаковым именем.

import os
from shutil import copy2

SOURCE = "c:\\source\\"

DEST = "c:\\dest\\"

# Iterate recursively through all files and folders under the source directory
for path, dirs, files in os.walk(SOURCE):
    # For each directory iterate over the files
    for f in files:
        # Grab the first letter of the filename
        starting_letter = f[0].upper()
        # Construct the full path of the current source file
        source_path = os.path.join(path, f)
        # Construct the destination path using the first letter of the
        # filename as the folder
        dest_path = os.path.join(DEST, starting_letter)
        # Create the destination folder if it doesn't exist
        if not os.path.isdir(dest_path):
            os.makedirs(dest_path)
        # Copy the file to the destination path + starting_letter
        copy2(source_path, dest_path)
3 голосов
/ 01 мая 2011

Я подозреваю, что это будет работать в PowerShell.

gci -path c:\somedir -filter * -recurse |
    where { -not ($_.PSIsContainer) } |
    foreach { move-item -path $_.FullName -destination $_.Substring(0, 1) }
2 голосов
/ 01 мая 2011

ls c:\somedir\* -recurse | ? { -not ($_.PSIsContainer)} | mv -destination "C:\someotherdir\$($_.Name.substring(0,1))" } ... -whatif: P

1 голос
/ 01 мая 2011

Вот ответ в Python, обратите внимание, что предупреждающее сообщение, вы можете иметь дело с перезаписью по-разному. Также сохраните это в файл в корневом каталоге и запустите его там, в противном случае вам придется изменить аргумент на os.walk, а также порядок объединения путей.

import os
import sys

try:
    letter = sys.argv[1]
except IndexError:
    print 'Specify a starting letter'
    sys.exit(1)

try:
    os.makedirs(letter)
except OSError:
    pass # already exists

for dirpath, dirnames, filenames in os.walk('.'):
    for filename in filenames:
        if filename.startswith(letter):
            src = os.path.join(dirpath, filename)
            dst = os.path.join(letter, filename)
            if os.path.exists(dst):
                print 'warning, existing', dst, 'being overwritten'
            os.rename(src, dst)
0 голосов
/ 30 апреля 2011

конечно, я помогу : посмотрите на os.path.walk в Python2, который, я считаю, просто os.walk в Python3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...