상위 디렉터리 basename을 사용하여 for 루프에 새 디렉터리 만들기

상위 디렉터리 basename을 사용하여 for 루프에 새 디렉터리 만들기

for 루프를 사용하여 파일(예: .txt)을 이름의 일부로 원래 디렉터리 이름을 사용하는 새 디렉터리로 이동하려고 하지만 이름에 추가 "with-new-files"를 추가하여 디렉토리는 새로운 내용이며 여기에 포함된 콘텐츠입니다.

상위 디렉터리에 .txt 파일이 포함된 디렉터리가 약 10개 있으므로 수동으로 새 디렉터리를 만들고 파일을 이동하는 대신 for 루프를 사용하는 것이 이상적입니다.

예를 들어 다음과 같은 것이 있습니다.

1_SpecialDirectoryNameA
    - fileA1.txt
    - fileA2.txt
    - unrelated_directory_A

2_SpecialDirectoryNameB
    - fileB1.txt
    - fileB2.txt
    - unrelated_directory_B

내가 원하는 것은:

1_SpecialDirectoryNameA
    - unrelated_directory_A

2_SpecialDirectoryNameB
    - unrelated_directory_B

New-directories-with-files
    - 1_SpecialDirectoryNameA_with_new_files
         - fileA1.txt
         - fileA2.txt
    - 2_SpecialDirectoryNameB_with_new_files
        - fileB1.txt
        - fileB2.txt

다음 코드를 시도했지만 mkdir 단계에서 멈춰서 다음 메시지가 나타납니다: mkdir: 1_SpecialDirectoryNameA: 해당 파일 또는 디렉터리가 없습니다 mkdir: 2_SpecialDirectoryNameB: 해당 파일 또는 디렉터리가 없습니다

mkdir New-directories-with-files

for dir in */   
do
    cd $dir
    mkdir "${dir}_with_new_files"
    mv *.txt "${dir}_with_new_files"
    mv "${dir}_with_new_files" ../New-directories-with-files/
    cd ../
done

지금까지 제가 성공한 유일한 사례는 다음과 같습니다.

for dir in */   
do
    cd $dir
    mkdir newfolder_files
    cd ../
done

이 코드를 사용하면 .txt 파일을 새 "newfolder_files" 디렉터리로 성공적으로 이동할 수 있지만 모든 새 디렉터리를 함께 이동하려면 먼저 이름을 1_newfolder_files로 수동으로 변경해야 합니다.

${dir} 비트를 사용하여 상위 디렉토리 이름을 추가하는 방법을 잘 모르겠습니다.

어떤 조언이라도 대단히 감사하겠습니다. 감사합니다!

답변1

Michelle, 루프가 디렉토리 이름을 for채우고 있습니다dir후행 슬래시 포함. 변수 끝에서 패턴을 제외하려는 것을 나타내는 ; 로 바꿔서 ${dir}즉시 잘라낼 수 있습니다 . (변수 내용 자체를 실제로 변경하는 것이 아니라 코드의 해당 지점에서 바꾸기만 하면 됩니다.)${dir%%/}%%

스크립트에 또 다른 문제가 있습니다. for루프는 첫 번째 줄에서 만든 새 디렉터리("New-directories-with-files")에 대해서도 반복됩니다. 디렉토리 이름이 예제의 패턴을 따른다고 가정 하면 를 for dir in */사용할 수 있습니다 . for dir in *_*/또 다른 옵션은 "파일이 있는 새 디렉터리"를 상위 디렉터리에 배치하는 것입니다.

답변2

$dir내가 보는 문제는 포함될 디렉터리 이름(후행 슬래시 포함)을 일치시키는 방식이 구문 분석 1_SpecialDirectoryNameA/되고 해당 플래그 없이는 상위 폴더가 생성되지 않으므로 오류가 발생한다는 것입니다.mkdir ${dir}_with_new_filesmkdir 1_SpecialDirectoryNameA/_with_new_filesmkdir-p

${dir%/}_with_new_files이를 방지하는 한 가지 방법은 int를 사용하는 것과 유사한 쉘 매개변수 확장을 사용하는 것입니다.이 답변

내가 본 또 다른 문제는 for dir in */스크립트의 일부가 새로 생성된 디렉터리와도 일치하므로 안전한 위치(예: 상위 폴더)에 생성하는 것이 더 낫다는 것입니다.

따라서 스크립트의 가능한 수정 버전은 다음과 같습니다.

mkdir ../New-directories-with-files

for dir in */
do
    cd $dir
    mkdir "${dir%/}_with_new_files"
    mv *.txt "${dir%/}_with_new_files"
    mv "${dir%/}_with_new_files" ../../New-directories-with-files/
    cd ../
done

mv ../New-directories-with-files .

관련 정보