하위 집합의 각 디렉터리에서 작동하는 bash 스크립트를 작성하려고 합니다. 안타깝게도 경로에 공백이 포함되어 있어 이름을 변경할 수 없습니다.
루프는 for
모든 공간에서 중단을 요구합니다. 수십 가지 변형을 시도했지만 해결책을 찾을 수 없습니다.
단순화된 버전은 다음과 같습니다.
#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
for file in `ls -d "$SOURCE"/201*`
do
echo "File: $file"
done
/Volumes/Time Machine Backups/Backups.backupdb/Zaphod/2017-06-30-215735
예를 들어 별도의 변수에서 각 항목을 가져오는 방법을 제안할 수 있는 사람이 있나요 ?
답변1
최소한으로 변경되는 솔루션은 다음과 같습니다.
#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
for file in "$SOURCE"/201*
do
echo "File: $file"
done
다른 옵션(위치 매개변수를 변경하는 것이 문제가 되지 않는 경우):
#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
set -- "$SOURCE"/201*
for file; do
echo "File: $file"
done
보다 정확한 솔루션은 디렉토리를 피하고 공백이 있는 파일을 처리합니다(개행은 아님).
ls -dp "$a"/201* | grep -v '/$' |
while read f; do echo "File:$f"; done
또는 모든 이름에 대해 작동하지만 도트 파일도 나열할 수 있는 솔루션(이름이 일치하는 경우):
find "$a" -type f -name "201*" -exec echo "File: {}" \;
답변2
디렉터리의 파일에 공백이 없는 경우:
#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
cd "$SOURCE"
for file in $(ls -d ./201*)
do
echo "File: $file"
done
디렉토리 목록에 공백이 있는지 확실하지 않은 경우 다음을 수행하십시오.
#!/bin/bash
SOURCE="/Volumes/Time Machine Backups/Backups.backupdb/Zaphod"
cd "$SOURCE"
shopt -s nullglob
for filename in 201*;do
if [[ ! -d "$filename" ]];then
echo "$filename"
fi
done
shopt -u nullglob
디렉토리 파일 이름을 원하는지 확실하지 않습니다. 그렇지 않은 경우 이것이 작동합니다.
나는 공백이 있는지 모를 때 일반적으로 두 번째 방법이 선호되는 솔루션이라고 생각합니다.