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

Sooo Я никогда не использовал этот язык, но в настройках вы можете перейти на клавиатуру, щелкнуть по настройкам макета, на маленьком +, затем найти бенгали, и я могу видеть разные виды probhat, вы можете искать Dvorak внутри , но после нескольких тестов вы должны найти то, что хотите.

1
задан 7 February 2018 в 11:24

4 ответа

Использование только shell (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
ответ дан 23 May 2018 в 12:02

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

$> 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 для копирования или перемещения по необходимости [ ! d1]

1
ответ дан 23 May 2018 в 12:02

Решение 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
ответ дан 23 May 2018 в 12:02

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

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

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

Пример run

$ 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/ - s ubstitute a by b (.*)\/ - взять все, пока (кроме) не будет последней косой черты, сохраняющей ее как группу 1 и замените ее на [ f11] - группа 1 (имя dir), косая черта и группа 1 снова (префикс имени файла)
0
ответ дан 23 May 2018 в 12:02

Другие вопросы по тегам:

Похожие вопросы: