no diretório original "A":
find . -type f > a.txt
diretório "B":
while read file; do if [[ "$file" = */* ]]; then mkdir -p "${file%/*}"; fi; touch "$file"; done < a.txt
Resultado: Etapa 2 "cria os arquivos" (quero dizer apenas com o mesmo nome de arquivo, mas com tamanho de 0 Byte), mas se houver subdiretórios no diretório "A", o passo 2 não poderá criar os arquivos no diretório. subdir, porque não há diretórios nele.
Pergunta: Existe uma maneira de o "toque" criar diretórios?
foto rápida:
while read FILENAME
do
mkdir -p $(dirname "$FILENAME") && touch "$FILENAME"
done < a.txt
Esteja ciente de caracteres especiais (espaços em branco, ...) em nomes de arquivos / arquivos e assim por diante ...
Eu estou com um bom chute paralelo da GNU ultimamente. Aqui está uma maneira de fazer isso em uma linha usando essa ferramenta:
find A -type d | parallel 'mkdir -p B/$(dirname {})' && find . -type f | parallel 'touch B/{}'
Observe que isso é ineficiente porque executa muito% desnecessmkdir -p
desnecessário para diretórios intermediários. Isso deve ser otimizado se você estiver lidando com estruturas de diretório realmente grandes.
Isso funciona mesmo se A contiver o arquivo:
Registros de 12 "/ 14" do meu irmão / dir do meu irmão
(cd A; find . -type f) | (cd B; parallel 'mkdir -p {//}; touch {}')
Tendo lidado com usuários que criam nomes de arquivos "criativos", eu sempre testo scripts como esses em
My brother's 12" records
Se funcionar para isso, então as chances são boas que não irá falhar.
Obrigado ao Phil H por dar os blocos básicos de construção.
Antes de fazer:
cat a.txt | while read FILENAMES; do touch "$FILENAMES"; done
faça:
cat a.txt | sed -e 's|/[^/]*$||' | uniq | while read DIRNAMES; do mkdir -p "$DIRNAMES"; done
Como já foi dito, tenha cuidado com caracteres especiais em nomes / nomes de arquivos, especialmente barras (eu odiaria ter um arquivo chamado "aaa / ccc", mas é sempre possível).