Troca de nomes de arquivos e diretórios

2

Eu tenho uma coleção de arquivos em ./date-and-time/fixed/path/filename , onde date-and-time e filename são variáveis. Eu gostaria de mover todos esses arquivos para ./filename/date-and-time . O caminho anterior é o nome do arquivo e o nome do arquivo anterior é o caminho. Existe uma boa maneira de fazer isso? Existem ~ 1000 arquivos no total com ~ 100 nomes de arquivos distintos.

    
por Charles 28.02.2018 / 04:23

3 respostas

4

Algo como isso deve funcionar (note que eu tenho echo os comandos reais; verifique cuidadosamente se está fazendo a coisa certa antes de removê-los)

#!/bin/bash

shopt -s nullglob

for file in */fixed/path/*; do 
  [[ -f "$file" ]] || continue
  f="${file##*/}"; d="${file%%/*}"
  echo mkdir -p "$f" && echo mv --no-clobber -- "$file" "$f/$d"
done
    
por steeldriver 28.02.2018 / 05:07
2

Assumirei que o padrão para o caminho é sempre ./date-and-time/fixed/path/filename com a variável date-and-time e filename .

date-and-time pode ser extraído via awk :

$ echo './date-and-time/fixed/path/filename' |awk -F "/" '{print }'
date-and-time

filename é um pouco mais fácil de obter, pois pode ser extraído por basename :

$ basename ./date-and-time/fixed/path/filename
filename

Destes dois segmentos de código, segue-se um script não testado para mover os arquivos da maneira que você descreve quando executado em . . Por favor, verifique antes de usar.

#!/bin/bash

for i in ./*/fixed/path/*; do
    date_and_time=$(echo "$i" |awk -F "/" '{print }');
    filename=$(basename "$i");
    mkdir "$filename";
    mv "$i" "$filename"/"$date_and_time";
done;
    
por dsstorefile1 28.02.2018 / 05:04
0

Assim:

mkdir ./filename/ && mv ./date-and-time/path/to/path-to-your-folder/* ./filename/date-and-time

Editar :

Se você precisar criar mais pastas, recomendo criar um script como este:

Antes de começar, recomendo que você faça um backup da pasta em que está tentando fazer isso.

cd na pasta em que você está tentando operar e, em seguida:

for file in *; do
  if [[ -f "$file" ]]; then
    mkdir "${file%.*}"
    mv "$file" "${file%.*}"
  fi
done
  1. Faz um loop sobre todos (*) os arquivos na pasta atual.
  2. crie uma pasta (mkdir) a partir do arquivo sem sua extensão $ {file%. *}
  3. move (mv) o arquivo para essa pasta.
por An0n 28.02.2018 / 04:38