파일 목록이 포함된 디렉터리가 있습니다. 이러한 파일은 모두 이름에 공백이 있습니다.
확장자를 제외하고 파일 이름을 포함하는 각 파일에 대한 디렉터리를 만들고 싶습니다(모든 파일의 확장자는 .doc입니다).
예를 들어:
내 디렉토리 내용
first file.doc
second file.doc
third file.doc
예상되는 결과
first file/first file.doc
second file/second file.doc
third file/third file.doc
생성해야 하는 디렉터리 이름을 확인하려면 다음 명령을 사용하세요.
find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'
결과는 다음과 같습니다.
first file
second file
third file
각 항목에 대해 디렉터리를 만들어야 한다는 것을 이해합니다.
나는 성공하지 않고 다음을 시도했습니다.
find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}' -exec mkdir '{}' \;
#error with awk: it cannot open the file -exec because it does not exist
mkdir `find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'`
#it creates several directories per name because there are spaces in the names
mkdir `"find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'"`
#-bash: find . -maxdepth 1 -name *.doc | awk -F .doc '{print }': command not found
mkdir "`find . -maxdepth 1 -name "*.doc" | awk -F ".doc" '{print $1}'`"
#it tries to create a unique directory with all the file names as a single name, which is not good of course
가능하다면 파일 이름에서 모든 공백을 제거하고 싶지만 프로젝트 제약 조건에 맞게 유지해야 합니다.
이러한 디렉터리를 만들 수 있게 되면 일치하는 디렉터리에 있는 모든 파일을 이동하는 방법을 알아내야 합니다. 이 모든 작업은 하나의 명령으로 수행할 수 있습니다.
저는 bash와 RedHat 2.6을 사용하고 있습니다.
당신의 도움을 주셔서 감사합니다. 로랑
답변1
그리고 zsh
:
mkdir -p -- *.doc(:r)
또는:
for f (*.doc) {
mkdir -p -- $f:r &&
mv -- $f $f:r/
}
동등함 bash
(모든 POSIX 쉘에서도 작동하지만 zsh
):
for f in *.doc; do
mkdir -p -- "${f%.*}" &&
mv -- "$f" "${f%.*}/"
done
(숨겨진 파일은 포함되지 않으니 주의하세요)
답변2
파일/디렉터리 이름의 공백은 이름이 올바르게 인용되는 한 괜찮습니다.
find . -maxdepth 1 -name "*.doc" | while IFS= read -r f; do
mkdir -- "${f%.doc}";
done
답변3
cd /path/to/dir
( set -- *\ *
printf 'd="%s" ; mkdir ./"${d%%.doc}"\n' "$@"
) | . /dev/stdin
쉘 glob을 사용하여 서브쉘의 매개변수를 설정한 다음 printf를 사용하고 파이프에 데이터를 제공할 수 있습니다. 파이프를 스크립트 소스로 사용합니다.
각 디렉토리의 파일을 이동하려면 다음을 수행하십시오.
cd /path/to/dir
( set -- *\ *
printf 'f="%s" ; d="${f%%.doc}"
mkdir ./"$d" ; echo "mv ./\"$f\" ./\"$d\"/\"$f\""\n' "$@"
) | . /dev/stdin
참고: 커밋하기 전에 출력을 테스트하기를 원하기 때문에 의도적으로 위 내용을 에코로 제한했습니다.
수정됨 - printf에 2% 백분율을 사용하는 것을 잊었습니다.
그런데, 나는 이것을 테스트했습니다:
% printf 'touch ./"%s file.doc"\n' first second third fourth fifth |
. /dev/stdin
% ls
> fifth file.doc first file.doc fourth file.doc second file.doc third file.doc
% ( set -- *\ *
printf 'f="%s" ; d="${f%%.doc}"
mkdir ./"$d" ; mv ./"$f" ./"$d"\n' "$@"
) | . /dev/stdin
% ls
> fifth file first file fourth file second file third file
% cd fifth\ file ; ls
> fifth file.doc