IFS=$(echo -en "\n\b")
를 사용하여 쉘을 가정하고 echo -e
어쨌든 shebang 라인에 bash가 있으므로을 사용할 수 있습니다 IFS=$'\n\b'
. 백 스페이스를 구분자로 만드는 것은 다소 이상합니다. IFS
어쨌든하고있는 일이 필요하지 않습니다 .
OLDIFS=$IFS
…
IFS=$OLDIFS
이것은 초기에 설정된 IFS
경우에만 이전 값을 복원합니다 IFS
. IFS
처음에 설정 해제 된 경우 IFS
빈 문자열로 설정 되며 이는 완전히 다릅니다. ksh, bash 또는 zsh에서 IFS
임시 로 설정해야하는 경우 함수에 코드를 작성 IFS
하고이 함수에 로컬로 만들 수 있습니다. 다른 쉘에서는 설정되지 않은 경우에주의해야합니다.
`find /mnt/library/Libra/Libra/Ashfords -name "*.pdf"`
의 출력에서 명령 대체를 사용하지 마십시오 find
.
- 이렇게하면 출력이의 문자로 분할됩니다
$IFS
. IFS
줄 바꿈으로 설정 하면 줄 바꿈으로 출력이 분할되지만 줄 바꿈이 포함 된 파일 이름은 여전히 처리 할 수 없습니다.
- 명령 대체의 결과는 단어로 분할 될뿐만 아니라 각 단어가 glob 패턴으로 사용됩니다. 당신이라는 파일을 경우
A[12].pdf
, A1.pdf
그리고 A2.pdf
, 당신은 될 겁니다 A1.pdf A2.pdf A1.pdf A2.pdf
. 로 글 로빙을 끌 수 있지만 (와 set -f
함께 다시 켜기 set +f
) 여기서 (대부분의 경우처럼) 올바른 방법은 명령 대체를 사용하지 않는 것입니다.
에 -exec
인수를 사용하십시오 find
(또는 시스템이 -print0
있는 경우 find … -print0 | xargs -0 …
대신 사용할 수 있습니다) . 이것은 고대 Linux 시스템이나 현재 OpenBSD 시스템은 -print0
있지만 이식 가능하지 않은 경우에 한 번에 여러 파일에서 작동하는 경우에만 유용합니다 -exec … {} +
.
ORIGTS=`stat -c "%Y" $f`
# [transform $f]
touch -t $ORIGTS $f
주위에 큰 따옴표가 누락되었습니다 $f
(이것이 분할의 결과이고 IFS
그 이후로 변경되지 않았고 globbing이 해제 된 경우 필요하지 않지만 실제로는 할 수없는 이유가없는 한 항상 큰 따옴표를 넣습니다. ' t) 그대로 두십시오.
이것은 어색하고 이식성 stat
이 없습니다 ( 일부 시스템에는 존재하지 않으며 해당 시스템의 인수는 시스템마다 다릅니다). touch
파일을 다른 파일의 타임 스탬프로 설정하는 이식 가능한 옵션이 touch -r REFERENCE_FILE FILE
있습니다. 대신 두 가지 방법 중 하나를 권장합니다.
- 가능하면 먼저 원본 파일을 새 파일로 변환 한 다음 호출
touch -r
하여 새 파일의 날짜를 설정하고 마지막으로 새 파일을 제 위치로 이동하십시오. 입력에 문제가 발생하기 전에 출력이 양호한 지 확인하는 것이 좋습니다. 그렇지 않으면 어떤 이유로 든 변환이 중단되면 (예 : 정전) 데이터가 손실됩니다.
- 변환이 제어 할 수없는 블랙 박스 인 경우
touch -r
두 번 사용할 수 있습니다 . 한 번은 원래 파일의 날짜를 빈 임시 파일 (자동으로 생성됨)에 저장 한 다음 변환 후 다시 날짜를 복원합니다. 임시 파일을 사용합니다.
그러므로:
find /mnt/library/Libra/Libra/Ashfords -name '*.pdf' \
-exec sh -c 'transform "$0" to "$0.tmp" && touch -r "$0" "$0.tmp" && mv -f "$0.tmp" "$0"' {} \;
IFS
드문 것 같습니다. 백 스페이스에서 분리하고 싶습니까 (\b
)? 몇 가지 팁 은 unix.stackexchange.com/questions/9496/… 을 참조하십시오 .