for 루프를 사용하지 않고 하나의 명령줄에서 현재 디렉터리에 접두사를 추가하여 cp 파일을 일괄 처리하고 이름을 바꾸는 방법은 무엇입니까?

for 루프를 사용하지 않고 하나의 명령줄에서 현재 디렉터리에 접두사를 추가하여 cp 파일을 일괄 처리하고 이름을 바꾸는 방법은 무엇입니까?

예:

.
├── f1.md
├── f2.md
├── f3.md
├── f4.txt
├── f5.csv
├── f6.doc
├── s1
├── s2
├── s3
└── s4

4 directories, 6 files

f1.md/f2.md/f3.md현재 디렉토리에 복사하려고 하는데 결과 는 입니다 t-f1.md/t-f2.md/t-f3.md.t-

시도하고 희망하십시오:

for file in *md;do cp -a $file t-$file;done결과를 얻을 수 있지만 루프를 사용하면 매우 길어 보입니다 for. 동일한 결과를 얻기 위해 더 짧고 간단한 명령이 있으면 좋겠다고 생각했습니다.

답변1

GNU를 이용한 최단 경로parallel:

parallel --no-notice 'cp "{}" "t-{}"' ::: *.md

https://www.gnu.org/software/parallel/parallel_tutorial.html

답변2

파일을 복사하려면 이미 가지고 있는 루프가 가장 짧은 방법입니다. 루프 없이 하고 싶다면 다음 cp rename과 같이 결합할 수 있습니다.mv

mkdir tmp
cp -a *.md tmp
(cd tmp && rename '' 't-' tmp/*.md)
mv temp/*.md .

이렇게 하면 실행해야 하는 명령이 줄어들어(단지 하나의 cp 명령 대 파일당 하나의 명령) 프로그램 실행 속도가 빨라질 수도 있고 그렇지 않을 수도 있습니다. 이를 벤치마킹해야 합니다. 하지만 파일 수가 많으면 모든 파일을 cp rename및 에 전달하므로 실패합니다 mv.

답변3

그리고 mmv/ mcp:

mcp '*.md' t-#1.md

전임자. 주어진

$ tree .
.
├── f1.md
├── f2.md
├── f3.md
├── f4.txt
├── f5.csv
├── f6.doc
├── s1
├── s2
├── s3
└── s4

0 directories, 10 files

그 다음에

$ mcp -v '*.md' t-#1.md
f1.md -> t-f1.md : done
f2.md -> t-f2.md : done
f3.md -> t-f3.md : done

~로 이어지다

$ tree .
.
├── f1.md
├── f2.md
├── f3.md
├── f4.txt
├── f5.csv
├── f6.doc
├── s1
├── s2
├── s3
├── s4
├── t-f1.md
├── t-f2.md
└── t-f3.md

0 directories, 13 files

관련 정보