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_files
mkdir 1_SpecialDirectoryNameA/_with_new_files
mkdir
-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 .