Usando o “toque” para criar diretórios - crie uma cópia “sombra” dos diretórios recursivamente

2
  1. No diretório "A": %código%
  2. No diretório "B": %código%

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?

    
por LanceBaynes 17.01.2011 / 10:03

5 respostas

2

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
    
por 25.09.2011 / 16:42
7

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 ...

    
por 17.01.2011 / 10:09
2

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.

    
por 17.01.2011 / 12:43
1

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.

    
por 24.01.2011 / 00:09
0

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).

    
por 09.08.2011 / 11:49

Tags