Supondo que você tenha seus arquivos desejados em um arquivo de texto, você pode fazer algo como
while IFS= read -r file; do
echo mkdir -p ${file%/*};
cp /source/"$file" /target/${file%/*}/${file##*/};
done < files.txt
Isso vai ler cada linha da sua lista, extrair o diretório e o nome do arquivo, criar o diretório e copiar o arquivo. Você precisará alterar source
e target
para os diretórios pai reais que você está usando. Por exemplo, para copiar /foo/a/a.txt
para /bar/a/a.txt
, altere source
para foo
e target
para bar
.
Eu não posso dizer a partir de sua pergunta se você deseja copiar todos diretórios e, em seguida, apenas arquivos específicos ou se você quiser apenas os diretórios que conterão arquivos. A solução acima criará apenas os diretórios necessários. Se você quiser criar todos eles, use
find /source -type d -exec mkdir -p {} /target
Isso criará os diretórios. Quando eles estiverem lá, copie os arquivos:
while IFS= read -r file; do
cp /source/"$file" /target/"$file"
done
Atualizar
Este pequeno script moverá todos os arquivos modificados após 8 de setembro. Ele pressupõe as versões GNU de find
e touch
. Supondo que você esteja usando Linux, é isso que você terá.
#!/usr/bin/env bash
## Create a file to compare against.
tmp=$(mktemp)
touch -d "September 8" "$tmp"
## Define the source and target parent directories
source=/path/to/source
target=/path/to/target
## move to the source directory
cd "$source"
## Find the files that were modified more recently than $tmp and copy them
find ./ -type f -newer "$tmp" -printf "%h %pfind ./ -type d -exec mkdir -p ../bar/{} \;
" |
while IFS= read -rd '' path file; do
mkdir -p "$target"/"$path"
cp "$file" "$target"/"$path"
done
Estritamente falando, você não precisa do arquivo tmp. No entanto, desta forma, o mesmo script funcionará amanhã. Caso contrário, se você usar -mtime
de find, você precisaria calcular a data certa todos os dias.
Outra abordagem seria primeiro encontrar os diretórios, criá-los no destino e depois copiar os arquivos:
-
Crie diretórios todos
find ./ -type f -newer "$tmp" -exec cp {} /path/to/target/bar/{} \;
-
Encontre e copie os arquivos relevantes
find ../bar/ -type d -exec rmdir {} \;
-
Remova todos os diretórios vazios
while IFS= read -r file; do echo mkdir -p ${file%/*}; cp /source/"$file" /target/${file%/*}/${file##*/}; done < files.txt