Renomeando os arquivos com o nome do diretório pai prepending [closed]

0

É necessário renomear em massa arquivos que preenchem seu nome de diretório pai sem usar o comando rename .

por exemplo,

/tmp/2017-09-22/cyber.gz
/tmp/2017-09-23/cyber.gz
/tmp/2017-09-24/cyber.tar

Arquivos renomeados também precisam ser copiados em /tmp/archive sem afetar os arquivos originais.

Parece abaixo

/tmp/archive/2017-09-22_cyber.gz
/tmp/archive/2017-09-23_cyber.gz
/tmp/archive/2017-09-24_cyber.tar
    
por Nirmal 04.10.2017 / 02:22

2 respostas

1

Se não usar rename , veja como você pode fazer com Shell (Bash, ksh, ksh93, mksh, zsh) Pattern substitution expansion .

find * -path "archive" -prune -o -type f -exec \
    bash -c 'echo "$1" "archive/${1/\//_}"' find_bash '{}' \;
  • -path "archive" -prune está excluindo o diretório archive .

  • ${1/\//_} está substituindo Slash / por Underscore _ . O 1 aponta para o parâmetro find_bash first, que é o caminho do arquivo passando por {} .

(Substitua echo por cp para copiar ou mv para mover os arquivos)

Estrutura de diretórios:

.
├── 2017-09-22
│   └── cyber.gz
├── 2017-09-23
│   └── cyber.gz
├── 2017-09-24
│   └── cyber.tar
└── archive

Depois de executar o comando:

.
├── 2017-09-22
│   └── cyber.gz
├── 2017-09-23
│   └── cyber.gz
├── 2017-09-24
│   └── cyber.tar
└── archive
    ├── 2017-09-22_cyber.gz
    ├── 2017-09-23_cyber.gz
    └── 2017-09-24_cyber.tar
    
por 04.10.2017 / 07:47
1

Usando um script de shell curto:

#!/bin/sh

archive='/tmp/archive'

mkdir -p "$archive"

for name in /tmp/????-??-??/*; do
    dirdate=${name%/*}         # dirdate=$(dirname "$name")
    dirdate=${dirdate##*/}     # dirdate=$(basename "$dirdate")

    newname="$archive/${dirdate}_${name##*/}"

    if [ ! -e "$newname" ]; then
        echo cp "$name" "$newname"
    fi
done

Isso seleciona dirdate como o nome de base dos diretórios que têm datas como seus nomes e cria um novo nome para cada arquivo usando isso.

Se o novo nome não existir dentro do diretório archive , o arquivo será copiado para lá.

Remova echo do script acima para realizar a cópia.

Para o exemplo dado, o script executará as seguintes operações:

cp /tmp/2017-09-22/cyber.gz /tmp/archive/2017-09-22_cyber.gz
cp /tmp/2017-09-23/cyber.gz /tmp/archive/2017-09-23_cyber.gz
cp /tmp/2017-09-24/cyber.tar /tmp/archive/2017-09-24_cyber.tar
    
por 04.10.2017 / 08:34

Tags