У меня есть некоторые файлы с различными расширениями такой как *.pdf
, *.mp3
, *.jpg
и немногие другие. Все они хранятся в a parent
каталог.
Как я могу получить список всех расширений, создать некоторые папки на основе этих расширений и затем переместить все файлы в их соответствующие папки?
Приведенный ниже сценарий python выполняет свою работу. Скрытые файлы хранятся отдельно в папке , а также файлы без расширения.
Поскольку его можно использовать для более широкого круга целей, я добавил несколько параметров:
exclude = ()
remove_emptyfolders = True
или False
) shutil.move(subject, new_dir+"/"+name)
на:
shutil.copy(subject, new_dir+"/"+name)
Сценарий:
#!/usr/bin/env python3
import os
import subprocess
import shutil
# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
if name.startswith("."):
extension = ".hidden_files"
elif not "." in name:
extension = ".without_extension"
else:
extension = name[name.rfind("."):]
if not extension in exclude:
new_dir = reorg_dir+"/"+extension[1:]
if not os.path.exists(new_dir):
os.mkdir(new_dir)
shutil.move(subject, new_dir+"/"+name)
def cleanup():
filelist = []
for root, dirs, files in os.walk(reorg_dir):
for name in files:
filelist.append(root+"/"+name)
directories = [item[0] for item in os.walk(reorg_dir)]
for dr in directories:
matches = [item for item in filelist if dr in item]
if len(matches) == 0:
try:
shutil.rmtree(dr)
except FileNotFoundError:
pass
if remove_emptyfolders == True:
cleanup()
ЕСЛИ существует риск нежелательная перезапись повторяющихся файлов
За счет нескольких дополнительных строк мы можем предотвратить перезапись возможных дубликатов. В приведенном ниже коде дубликаты будут переименованы в:
duplicate_1_filename, duplicate_2_filename
и т. Д.
Скрипт:
#!/usr/bin/env python3
import os
import subprocess
import shutil
# --------------------------------------------------------
reorg_dir = "/path/to/directory_to_reorganize"
exclude = (".jpg") # for example
remove_emptyfolders = True
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
for name in files:
subject = root+"/"+name
if name.startswith("."):
extension = ".hidden_files"
elif not "." in name:
extension = ".without_extension"
else:
extension = name[name.rfind("."):]
if not extension in exclude:
new_dir = reorg_dir+"/"+extension[1:]
if not os.path.exists(new_dir):
os.mkdir(new_dir)
n = 1; name_orig = name
while os.path.exists(new_dir+"/"+name):
name = "duplicate_"+str(n)+"_"+name_orig
n = n+1
newfile = new_dir+"/"+name
shutil.move(subject, newfile)
def cleanup():
filelist = []
for root, dirs, files in os.walk(reorg_dir):
for name in files:
filelist.append(root+"/"+name)
directories = [item[0] for item in os.walk(reorg_dir)]
for dr in directories:
matches = [item for item in filelist if dr in item]
if len(matches) == 0:
try:
shutil.rmtree(dr)
except FileNotFoundError:
pass
if remove_emptyfolders == True:
cleanup()
Имея в виду OP, мы все забыли добавить инструкцию о том, как использовать. Поскольку могут появиться повторяющиеся вопросы ( и есть ), тем не менее, это может быть полезно.
реорганизовать. py
В разделе заголовка сценария установите целевой каталог (с файлами для реорганизации):
reorg_dir = "/ path / to / directory_to_reorganize"
(используйте кавычки, если каталог содержит пробелы)
возможных расширений, которые вы хотите исключить (возможно, ни одного, как показано ниже):
exclude = ()
и если вы хотите впоследствии удалить пустые папки:
remove_emptyfolders = True
Запустите сценарий с помощью команды:
python3 /path/to/reorganize.py
NB , если вы хотите скопировать файлы вместо переместить , замените:
shutil.move(subject, new_dir+"/"+name)
на:
shutil.copy(subject, new_dir+"/"+name)
Пожалуйста, попробуйте сначала небольшой образец.
Попробуйте этот сценарий оболочки.
#!/bin/sh
src=`dirname "$1"`/`basename "$1"`;
for file in "$src"/*?.?*; do
if test -f "$file"; then
dest="$src${file##*.}"_files;
mkdir -p "$dest";
mv "$file" "$dest";
fi;
done;
# pass the directory to re-organize as first argument
# moves only regular files which have extension
# ignores other type of files including
# files having no extension, hidden files, directories, and links.
Вы можете использовать find
с несколько сложным ] exec
команда:
find . -iname '*?.?*' -type f -exec bash -c 'EXT="${0##*.}"; mkdir -p "$PWD/${EXT}_dir"; cp --target-directory="$PWD/${EXT}_dir" "$0"' {} \;
# '*?.?*' requires at least one character before and after the '.',
# so that files like .bashrc and blah. are avoided.
# EXT="${0##*.}" - get the extension
# mkdir -p $PWD/${EXT}_dir - make the folder, ignore if it exists
Замените cp
на echo
для пробного запуска.
Более эффективным и аккуратным было бы сохранение bash
команда в сценарии (скажем, в /path/to/the/script.sh
):
#! /bin/bash
for i
do
EXT="${i##*.}"
mkdir -p "$PWD/${EXT}_dir"
mv --target-directory="$PWD/${EXT}_dir" "$i"
done
И затем запустите find
:
find . -iname '*?.?*' -type f -exec /path/to/the/script.sh {} +
Этот подход довольно гибкий. Например, чтобы использовать имя файла вместо расширения ( filename.ext
), мы должны использовать это для EXT
:
NAME="${i##*/}"
EXT="${NAME%.*}"
ls | gawk -F. 'NF>1 {f= $NF "-DIR"; system("mkdir -p " f ";mv " $0 " " f)}'
Расчет списка расширений (после перемещения):
ls -d *-DIR
Расчет списка расширений (перед перемещением) :
ls -X | grep -Po '(?<=\.)(\w+)$'| uniq -c | sort -n
(в этом последнем примере мы вычисляем количество файлов для каждого расширения и сортируем его)
നിങ്ങൾക്ക് പേളിന്റെ പേരുമാറ്റുക / പേര് മാറ്റുക:
rename 's!(.*)\.(\w+)$! mkdir($2); "$2/$&"!ge' *