Como eu crio um diretório para cada arquivo em um diretório pai?

3

Eu tenho pasta pai e dentro dessa pasta eu tenho 4 arquivos

ParentFolder
      File1.txt
      File2.txt
      File3.txt
      File4.txt

Eu queria criar subpastas dentro da pasta pai e carregar o nome dos arquivos e, em seguida, mover cada arquivo dentro da pasta que o transporta tem o seguinte nome:

ParentFolder
    File1          
      File1.txt
    File2          
      File2.txt
    File3          
      File3.txt
    File4          
      File4.txt

Como posso fazer isso em lote ou script tsch? Eu tentei este script:

#!/bin/bash
in=path_to_my_parentFolder
for i in $(cat ${in}/all.txt); do
cd ${in}/${i} 
ls > files.txt
for ii in $(cat files.txt); do
mkdir ${ii}
mv ${ii} ${in}/${i}/${ii} 
done     
done
    
por Gilles 03.08.2015 / 21:54

3 respostas

7

Você está complicando demais isso. Não entendo o que você está tentando fazer com all.txt . Para enumerar os arquivos em um diretório, não chame ls : isso é mais complexo e não funciona de maneira confiável . Use um padrão de caractere curinga .

Para remover a extensão ( .txt ) no final do nome do arquivo, use o recurso de remoção de sufixos de substituição de variáveis . Sempre coloque aspas duplas na variável substituições .

cd ParentFolder
for x in ./*.txt; do
  mkdir "${x%.*}" && mv "$x" "${x%.*}"
done
    
por 04.08.2015 / 02:04
1

Em vez de loop, você pode usar find

find ParentFolder/* -prune -type f -exec \
  sh -c 'mkdir -p "${0%.*}" && mv "$0" "${0%.*}"' {} \;
    
por 03.08.2015 / 22:43
0

Ou você pode realmente simplificar. Use basename , parte de coreutils .

cd ParentFolder &&
for i in ./*.txt 
 do   
    d=$(basename "$i" .txt)   
    mkdir "$d" && mv "$i" "$d" 
 done
    
por 04.08.2015 / 14:36