
안녕하세요 현재 다음 코드를 실행하려고 합니다. YYYY/MM/DD 형식의 DATE 변수 안에 문자열을 저장했습니다. cut 명령을 사용하여 연도를 추출하려고 합니다. 파일이나 디렉터리가 아니라는 오류 메시지가 나타납니다. 수정하거나 다른 방법으로 할 수 있나요?
for file in ~/filesToSort/*
do
DATE=$(head -1 $file | tr "-" "/")
echo "${DATE}"
YYYY=$(cut -c1-4 accounts $DATE)
#echo "${YYYY}"
done
감사해요
답변1
유틸리티 cut
는 표준 입력 스트림에서 데이터를 읽지만 인수로 제공된 문자열에서는 작동하지 않습니다.
따라서 를 사용하려면 cut
표준 입력으로 데이터를 전달해야 합니다.
YYYY=$( printf '%s\n' "$DATE" | cut -d '/' -f 1 )
그러나 루프에서는 속도가 매우 느립니다. 대신 내장된 매개변수 대체를 사용하여 문자열 /
의 첫 번째 이후의 모든 항목을 삭제하세요 $DATE
.
YYYY=${DATE%%/*}
$DATE
이는 쉘 패턴과 일치하는 가장 긴 접미사 문자열을 제거합니다 /*
. 문자열이 2021/10/21
이면 를 반환합니다 2021
.
디렉토리에 있는 모든 파일의 처음 4자를 얻으려면(이것이 제가 설명한 내용의 핵심입니다.)믿다현재 코드가 시도하고 있는 경우) sed
다음과 같이 사용할 수 있습니다.
for name in "$HOME"/filesToSort/*; do
sed -e 's/\(....\).*/\1/' -e q "$name"
done
이는 각 파일의 첫 번째 줄을 읽고 줄의 내용을 줄의 처음 4개 문자로 바꾼 다음 결과를 터미널에 출력한 후 종료됩니다.
답변2
<<<
쉘이 이를 지원하는 경우 이를 위해 Here Strings( )를 사용할 수 있습니다 . 에서 man bash
:
Here Strings
A variant of here documents, the format is:
[n]<<<word
The word undergoes tilde expansion, parameter and variable expansion,
command substitution, arithmetic expansion, and quote removal. Path‐
name expansion and word splitting are not performed. The result is
supplied as a single string, with a newline appended, to the command
on its standard input (or file descriptor n if n is specified).
귀하의 경우에는 다음을 수행합니다.
for file in ~/filesToSort/*
do
date=$(head -1 "$file" | tr "-" "/")
echo "${DATE}"
yyy=$(cut -c1-4 <<< "$date")
echo "$yyy"
done
답변3
좋은 올레를 사용하는 또 다른 방법awk
for file in *; do
awk -F'-' 'NR==1 {print $1}' $file
done
-F '-'
-
awk에게 the를 구분 기호로 사용하라고 지시합니다.NR==1
awk에게 모든 파일의 첫 번째 줄만 읽도록 지시하세요.{print $1}
구분 기호로 구분된 첫 번째 필드만 인쇄합니다.