특정 이름의 시작 부분에 문자열을 추가하여 파일에 디렉터리 파일 이름을 씁니다.

특정 이름의 시작 부분에 문자열을 추가하여 파일에 디렉터리 파일 이름을 씁니다.

특정 디렉토리에서 사용하면 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곳에 추가하면 됩니다.zshtee

관련 정보