Вопрос: Переименовать файлы, добавляя их родительскую папку


Я хочу переименовать имя файла с его именем родительской папки, добавление имя папки перед текущим именем.

например:

Структура папок

SOCH NC KT 633-ROYAL BLUE-MULTI
|
| 1.jpg
|
| 2.jpg
|
| 3.jpg

ожидаемый результат

SOCH NC KT 633-ROYAL BLUE-MULTI
|
|_SOCH NC KT 633-ROYAL BLUE-MULTI1.jpg
|
|_SOCH NC KT 633-ROYAL BLUE-MULTI2.jpg
|
|_SOCH NC KT 633-ROYAL BLUE-MULTI3.jpg

SOCH NC KT 710-BLACK-MULTI

Может ли кто-нибудь сообщить, как это можно сделать в файле .sh? Есть ли какая-либо утилита для выполнения операции?


5
2018-04-20 09:37


Источник




Ответы:


В небольшом сценарии python переименование файлов рекурсивно (папки, а также подпапки):

#!/usr/bin/env python3
import shutil
import os
import sys

dr = sys.argv[1]

for root, dirs, files in os.walk(dr):
    for f in files:
        shutil.move(root+"/"+f, root+"/"+root.split("/")[-1]+f)

Как использовать

  • Скопируйте сценарий в пустой файл, сохраните его как rename_files.py
  • Запустите его с каталогом в качестве аргумента:

    python3 /path/to/rename_files.py /directory/with/files
    

Заметка

Как всегда, сначала попробуйте образец!

объяснение

Сценарий:

  • Просматривает каталоги, ища файлы.
  • Если файлы найдены, он разбивает путь к файлу с разделителем «/», сохраняя последнее в строке (которое является именем папки родителя), для вставки перед именем файла:

    root.split("/")[-1]
    
  • Затем переместите файл в переименованный файл:

    shutil.move(root+"/"+f, root+"/"+root.split("/")[-1]+f)
    

5
2018-04-20 09:55



@JacobVlijm то же самое можно сделать и в bash с for F in *; do cd $F; for D in *; do mv -Tv $D $F$D; done; cd ..; done, Просто упомянем, чтобы вы могли добавить его в свой ответ в качестве другого возможного решения, которое дано youre в родительском каталоге, где находятся каталоги, которые вы хотите сработать. - Videonauth
@Videonauth спасибо, но команда не работает должным образом :) - Jacob Vlijm
@JacobVlijm weird, я проверил его, прежде чем я разместил его, и он выполнил свою работу. я сделал тест папки с двумя слотами и внутри него, переключился в тестовую папку, созданную в файлах a и b с сенсорным экраном (только для проверки), и команда переименовала каждый файл, чтобы иметь имя папки в fron имени файла в обоих папки. - Videonauth


Использование только оболочки (bash) с небольшой помощью от mv:

#!/bin/bash
shopt -s globstar  ##globstar will let us match files recursively
files=( /foo/bar/**/*.jpg )  ##Array containing matched files, mention where to search and what files here
for i in "${files[@]}"; do 
    d="${i%/*}"  ##Parameter expansion, gets the path upto the parent directory
    d_="${d##*/}"  ##gets the name of parent directory
    f="${i##*/}"  ##gets the file name
        echo mv "$i" "$d"/"${d_}""$f"  ##renaming, remove echo after confirming what will be changed and you are good
done

Пример:

$ shopt -s globstar
$ files=( /foo/bar/**/*.jpg )
$ for i in "${files[@]}"; do d="${i%/*}"; d_="${d##*/}"; f="${i##*/}"; echo mv "$i" "$d"/"${d_}""$f"; done
mv /foo/bar/KT/633-ROYAL/4.jpg /foo/bar/KT/633-ROYAL/633-ROYAL4.jpg
mv /foo/bar/KT/633-ROYAL/5.jpg /foo/bar/KT/633-ROYAL/633-ROYAL5.jpg
mv /foo/bar/KT/633-ROYAL/6.jpg /foo/bar/KT/633-ROYAL/633-ROYAL6.jpg
mv /foo/bar/KT/633-ROYAL/BLUE-MULTI/1.jpg /foo/bar/KT/633-ROYAL/BLUE-MULTI/BLUE-MULTI1.jpg
mv /foo/bar/KT/633-ROYAL/BLUE-MULTI/2.jpg /foo/bar/KT/633-ROYAL/BLUE-MULTI/BLUE-MULTI2.jpg
mv /foo/bar/KT/633-ROYAL/BLUE-MULTI/3.jpg /foo/bar/KT/633-ROYAL/BLUE-MULTI/BLUE-MULTI3.jpg

3
2018-04-20 15:25





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

$> ls                                                                          
file1.txt  file2.txt  file3.txt
$> pwd
/home/xieerqi/testing_dir
$> find . -type f -printf "%f\0" | \                                           
> while IFS="" read -d "" filename ; do \                                      
> echo $filename ${PWD##*/}_$filename   ; done
file2.txt testing_dir_file2.txt
file1.txt testing_dir_file1.txt
file3.txt testing_dir_file3.txt

замещать echo с mv или cp для копирования или перемещения по мере необходимости


1
2018-04-20 15:51





Решение Bash, выполняемое из папки, в которую помещаются имена файлов, которые вы хотите изменить. Вы должны изменить workdir на ваш путь

#!/bin/bash

shopt -s globstar

workdir="/path/to/your/dir"

for folder in $workdir/**/*;do
  if [[ -d "$folder" ]]; then
    for file in "$folder"/*;do
        if [[ -f "$file" ]]; then
            fi="`basename "$file"`"
            fo="`basename "$folder"`"
            mv "$file" "$folder/$fo$fi"
        fi
    done
  fi
done

Он изменится все файлы в все каталоги рекурсивно из вашей работы.


0
2018-04-20 14:09





Вы можете сделать это с помощью rename:

rename -n 's/(.*)\//$1\/$1/' */*

Эта команда должна быть запущена в каталоге непосредственно над каталогами, которые вы хотите обработать. Сначала будут перечислены изменения, которые вы проверите, если вы довольны результатами, запустите его без -n для выполнения переименования.

Пример выполнения

$ tree
.
└── SOCH NC KT 633-ROYAL BLUE-MULTI
    ├── 1.jpg
    ├── 2.jpg
    └── 3.jpg
$ rename 's/(.*)\//$1\/$1/' */*
$ tree
.
└── SOCH NC KT 633-ROYAL BLUE-MULTI
    ├── SOCH NC KT 633-ROYAL BLUE-MULTI1.jpg
    ├── SOCH NC KT 633-ROYAL BLUE-MULTI2.jpg
    └── SOCH NC KT 633-ROYAL BLUE-MULTI3.jpg

объяснение

rename 's/(.*)\//$1\/$1/' */*
  • s/a/b/ - substitute a от b
  • (.*)\/ - возьмите все до (за исключением) последней косой черты, сохраняя ее как группу 1 и заменим его на
  • $1\/$1 - группа 1 (имя dir), косая черта и группа 1 снова (префикс имени файла)

0
2018-02-07 07:32