방법

방법

방법

공백과 마침표가 포함된 무작위로 이름이 지정된 폴더가 포함된 디렉터리가 있습니다.

나는 작은 루프를 만들었습니다(스크립트에서) 이 폴더의 이름을 바꾸려면 이를 기반으로 내 디렉토리가 있습니다(테스트하고 클리어하세요):

$ ls -la
./
../
35._JK_io/
'43A. io kl_ -'/
'Mi.Nombre.es Adios'/

참고: 우리는 (creo) 모든 가능성을 나열하고 디렉터리와 폴더를 구별할 수 있도록 노력했습니다.

이제 디렉터리만 나열하는 루프를 만들고(미래) 이름을 바꾸려면 다음과 같이 하세요.

for archives in `sh -c 'ls -q */' sh`

do

echo  "$archives"
done

질문

문제는 스크립트를 실행하면 다음과 같은 결과가 나온다는 것입니다.

35._JK_io/:
43A.
io
kl_
-/:
Mi.Nombre.es
Adios/:

질문

이런 일이 발생하지 않고 공백이 있고 파일이 3개만 있는 것을 어떻게 방지합니까?

관찰하다

폴더에서 다른 스크립트를 실행하면 35._JK_io /하나의 디렉토리는 얻지만 다른 두 디렉토리는 얻지 못합니다.

감사합니다! !

답변1

디렉토리를 순환할 때, 특히 해당 디렉토리가 이상한 이름을 가지고 있는 경우에는 순환하지 마십시오 . 일반적으로 Unix 파일 이름에는 nul 문자( ) ls이외의 문자가 포함될 수 있으므로 프로그램 간에 경로 이름을 전달할 때 매우 주의해야 합니다 ./\0

대신에

for dirname in ./*/; do
    printf 'Directory name is "%s"\n' "$dirname"
done

/패턴의 마지막 패턴은 ./*/패턴을 디렉터리로만 확장합니다. 이렇게 하면 변수가 dirname비슷한 값을 얻게 됩니다 ./some directory name/. ./패턴 시작 부분에 포함시켰지만 원하는 경우 제거할 수 있습니다. 디렉터리 이름에 대시( -)가 첫 번째 문자로 포함된 경우 이름에 있는 대시가 명령줄 옵션으로 해석되지 않도록 나중에 mv -- "$dirname" "$newname"(with --)를 사용해야 합니다. 로 시작하는 mv경우에는 필요 하지 않습니다../$dirname--

이것은추가의변수 확장을 인용하는 것이 중요합니다. 그렇지 않으면 쉘이 값을 토큰화하고 파일 이름을 와일드카드로 지정합니다.

관련된:

관련 정보