상위 디렉터리의 각 파일에 대한 디렉터리를 만드는 방법

상위 디렉터리의 각 파일에 대한 디렉터리를 만드는 방법

상위 폴더가 있고 이 폴더에는 4개의 파일이 있습니다.

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

상위 폴더 내에 파일 이름으로 하위 폴더를 만든 다음 다음과 같은 이름으로 각 파일을 폴더 내부로 이동하고 싶습니다.

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

배치 또는 tsch 스크립트에서 이 작업을 어떻게 수행할 수 있나요? 나는 다음 스크립트를 시도했습니다.

#!/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

답변1

당신은 이것을 너무 복잡하게 만들고 있습니다. 당신이 무엇을 하려는지 이해가 안 돼요 all.txt. 디렉터리의 파일을 열거하려면 호출하지 마세요 ls. 이는 더 복잡하고어쨌든 안정적으로 작동하지 않습니다. 사용하다와일드카드 패턴.

.txt파일 이름 끝의 확장자( )를 제거하려면 접미사 제거 기능을 사용하십시오.변수 대체. 변수 대체에는 항상 큰따옴표를 사용하세요..

cd ParentFolder
for x in ./*.txt; do
  mkdir "${x%.*}" && mv "$x" "${x%.*}"
done

답변2

루핑 대신 사용할 수 있습니다find

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

답변3

아니면 정말 간단하게 유지할 수도 있습니다. 사용 basename, 부분 coreutils.

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

관련 정보