![방법](https://linux55.com/image/137250/%EB%B0%A9%EB%B2%95.png)
방법
공백과 마침표가 포함된 무작위로 이름이 지정된 폴더가 포함된 디렉터리가 있습니다.
나는 작은 루프를 만들었습니다(스크립트에서) 이 폴더의 이름을 바꾸려면 이를 기반으로 내 디렉토리가 있습니다(테스트하고 클리어하세요):
$ 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
--
이것은추가의변수 확장을 인용하는 것이 중요합니다. 그렇지 않으면 쉘이 값을 토큰화하고 파일 이름을 와일드카드로 지정합니다.
관련된: