Скрипт 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, мы все забыли добавить инструкцию по использованию. Поскольку дублирующие вопросы могут ( и появляются) появляться, тем не менее, это может быть полезно.
Как пользоваться
- Скопируйте любой из сценариев в пустой файл, сохраните его как
reorganize.py
В разделе заголовка скрипта установите целевой каталог (с файлами для реорганизации):
reorg_dir = "/path/to/directory_to_reorganize"
(используйте кавычки, если каталог содержит пробелы)
возможные расширения, которые вы хотели бы исключить (вероятно, нет, как показано ниже):
exclude = ()
и если вы хотите удалить пустые папки впоследствии:
remove_emptyfolders = True
Запустите скрипт с помощью команды:
python3 /path/to/reorganize.py
Примечание: если вы хотите скопировать файлы вместо перемещения , замените:
shutil.move(subject, new_dir+"/"+name)
по:
shutil.copy(subject, new_dir+"/"+name)
Пожалуйста, попробуйте сначала на небольшом образце.
-iname '*.*'
следует позаботиться о случаях углового меня обеспокоенные ... хорошей идея!*.fig.bak
или.profile/.bashrc
те, но он должен обрабатывать только файлы с расширениями, по крайней мере. Благодарю.Расчет списка расширений (после переезда):
Расчет списка расширений (до переезда):
(в этом последнем примере мы рассчитываем количество файлов для каждого расширения и сортируем его)
источник
ls -X | grep -Po '(?<=\.)(\w+)$'
была моей первой идеей, чтобы получить отсортированный список расширений. Это очень плохо? Что ты посоветуешь?ls -X
делает. Относительно того, почему я рекомендую противls
, смотрите unix.stackexchange.com/q/128985/70524 и unix.stackexchange.com/q/112125/70524 . Чтобы добиться того, что вы делаете, я бы пошел более длинным путем:find . -type f -name '*?.?*' -print0 | sed -z 's/.*\.//' | sort -zu
(с необязательным| uniq -cz
, если подсчет необходим). Иfind ... -print0 | gawk -v RS='\0'
(хотя это не очень портативный ) для первого.Попробуйте этот сценарий оболочки.
источник
filepath
сfile
. Я исправлю это прямо.for file in "$src"/*?.?*; do ..
read
может иметь неожиданное поведение. Вы также должны заключать в кавычки переменные в командах mkdir и mv.for i in *; do printf "%s\n" "$i"; done; for i in $(ls -d); do printf "%s\n" "$i"; done
Если у вас установлен Perl, переименуйте / prename:
источник