특정 디렉토리에서 사용하면 ls | tee -a file.txt
해당 디렉토리의 목록이 제공됩니다.
예:
file1.txt file2.txt file3.txt
ls
일괄 후처리를 위해 명령의 특정 문자열을 최종 출력에 추가하려면 어떻게 해야 합니까 ? 각 파일에 대해 특정 파일 이름과 특정 명령을 복사하여 붙여넣어야 합니다.
예는 다음과 같습니다
ls | tee -a string1(FilenameFromDirectory)string2
산출
string1(file1.txt)string2
string1(file2.txt)string2
string1(file3.txt)string2
답변1
시작과 끝에 문자열을 추가하는 것은 매우 간단합니다.
$ ls
file1.txt file2.txt file3.txt
$ ls | sed -e 's/^/string1/' -e 's/$/string2/'
string1file1.txtstring2
string1file2.txtstring2
string1file3.txtstring2
괄호를 사용하지 않는 것이 좋습니다 ( )
. 파일 이름에 특수 문자가 포함되면 처리가 더 복잡해집니다. 가능하다면 _
대신에 또는 를 사용하세요. -
괄호 사용을 고집하는 경우 다음과 같이 할 수 있습니다.
$ ls | sed -e 's/^/string1(/' -e 's/$/)string2/'
string1(file1.txt)string2
string1(file2.txt)string2
string1(file3.txt)string2
중요한: 터미널에서 결과를 인쇄하거나 이전처럼 파일로 전송하려는 경우에는 >
괜찮습니다 . tee
그러나 이를 사용하여 파일 이름을 바꾸거나 파일을 복사하거나 조작하려는 경우에는 작동하지 않습니다.분석하다ls
이 접근 방식은 매우 취약하며 약간 이상한 파일 이름으로 인해 충돌이 발생할 수도 있습니다. 더 안전한 접근 방식은 다음과 같습니다.
$ for file in *; do
printf 'string1(%s)string2\n' "$file"
done
string1(file1.txt)string2
string1(file2.txt)string2
string1(file3.txt)string2
답변2
printf 'string1(%s)string2\n' *
현재 작업 디렉토리에서 숨겨지지 않은 각 파일에 대해 한 줄을 인쇄 하고 string1(filename)string2
, 사전순으로 정렬하거나, 일치하는 파일이 없으면 오류와 함께 실패합니다.
일치하는 파일이 없을 때 아무것도 인쇄하지 않으면 오류를 보고하는 대신 N
(nullglob) glob 한정자를 사용하고 파일 수를 확인하여 수행할 수 있습니다.
files=( *(N) )
(( $#files == 0 )) || printf 'string1(%s)string2\n' $files
또는 익명 함수와 rc 스타일 배열 확장을 사용하세요.
() { print -rC1 'string1('$^files')string2'; } *(N)
그러나 각 파일에 대해 일부 명령을 실행하려면 다음을 수행할 수 있습니다.
for file (*(N)) cmd with $file as argument
이러한 명령/루프의 출력을 원시 stdout으로 보내고 일부 파일에 추가하려면 tee -a some-file
출력을 여러 번 리디렉션하는 경우 파이프로 연결하거나 암시적 내장이 아닌 >&1 >> some-file
곳에 추가하면 됩니다.zsh
tee