linux 터미널을 사용하여 파일 이름에 고유 한 숫자 문자열이없는 폴더의 모든 파일을 삭제하고 싶습니다. 예 :linux 터미널에서 filename에 같은 문자열을 포함하고있는 파일을 찾아서 삭제하십시오.
werrt-110009.jpg => delete
asfff-110009.JPG => delete
asffa-123489.jpg => maintain
asffa-111122.JPG => maintain
의견이 있으십니까?
linux 터미널을 사용하여 파일 이름에 고유 한 숫자 문자열이없는 폴더의 모든 파일을 삭제하고 싶습니다. 예 :linux 터미널에서 filename에 같은 문자열을 포함하고있는 파일을 찾아서 삭제하십시오.
werrt-110009.jpg => delete
asfff-110009.JPG => delete
asffa-123489.jpg => maintain
asffa-111122.JPG => maintain
의견이 있으십니까?
가 난 단지 지금 당신의 질문을 이해, 나는 생각한다. (특정 폴더에서) 고유하지 않은 숫자 값을 포함하는 모든 파일을 제거하려고합니다. 파일 이름에 다른 파일 이름에서도 찾을 수있는 값이 들어 있으면 두 파일을 모두 제거하려고합니다. 것
array=(werrt-110009.jpg asfff-110009.JPG asffa-123489.jpg asffa-111122.JPG)
그리고 delete
에 결과 : 당신의 예에서
# put all files in your folder in a list
# for array=(*) to work make sure you have enabled nullglob: shopt -s nullglob
array=(*)
delete=()
for elem in "${array[@]}"; do
# for each elem in your list extract the number
num_regex='([0-9]+)\.'
[[ "$elem" =~ $num_regex ]]
num="${BASH_REMATCH[1]}"
# use the extracted number to check if it is unique
dup_regex="[^0-9]($num)\..+?(\1)"
# if it is not unique, put the file in the files-to-delete list
if [[ "${array[@]}" =~ $dup_regex ]]; then
delete+=("$elem")
fi
done
# delete all found duplicates
for elem in "${delete[@]}"; do
rm "$elem"
done
이
array
은 다음과 같습니다
이
(이것은 가장 빠른 방법을하지 않을 수 있습니다) 나는 그렇게 할 것입니다 방법입니다 :delete=(werrt-110009.jpg asfff-110009.JPG)
이것은 무엇을 의미합니까?
필요한 경우 로컬 드라이브에서 작동합니다. 타사 서버에 마운트 된 드라이브의 경우 너무 느립니다. 서버에서 나는 다음을 사용한다 : php foreach (new RecursiveIteratorIterator ('../ to/folder')) $ filename) { $ arr [] = substr ("$ filename", -10, 6); \t } $ dubs = array_unique (array_diff_assoc ($ arr, array_unique ($ arr))); foreach ($ dubs as & $ rem) { array_map ('unlink', glob ($ path. "/ *". $ rem. ".jpg")); } ?> : 감사합니다. – ptminor
당신이 -regex 매개 변수 및 디렉토리에 일치하는 모든 문자열 파일을 삭제
사용 "RM은"명령 한 명령을 할 수있는 -delete 매개 변수 와 함께 명령을 찾을 리눅스를 사용할 수 있습니다
cd <path-to-directory>/ && rm *110009*
이 명령은 문자열이 일치하는 모든 파일을 삭제하는 데 도움이되며 파일 이름에 string의 위치에 의존하지 않습니다.
일치하는 문자열이있는 파일을 삭제하는 또 다른 옵션으로 rm 명령 옵션을 언급했습니다. 다음은
귀하의 요구 사항을 달성하기 위해 전체 스크립트이며,이 스크립트를 실행하는 방법#!/bin/sh -eu
#provide the destination fodler path
DEST_FOLDER_PATH="$1"
TEMP_BUILD_DIR="/tmp/$(date +%Y%m%d-%H%M%S)_clenup_duplicate_files"
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
clean_up()
{
if [ -d $TEMP_BUILD_DIR ]; then
rm -rf $TEMP_BUILD_DIR
fi
}
trap clean_up EXIT
[ ! -d $TEMP_BUILD_DIR ] && mkdir -p $TEMP_BUILD_DIR
TEMP_FILES_LIST_FILE="$TEMP_BUILD_DIR/folder_file_names.txt"
echo "$(ls $DEST_FOLDER_PATH)" > $TEMP_FILES_LIST_FILE
while read filename
do
#check files with number pattern
if [[ "$filename" =~ '([0-9]+)\.' ]]; then
#fetch the number to find files with similar number
matching_string="${BASH_REMATCH[1]}"
# use the extracted number to check if it is unique
#find the files count with matching_string
if [ $(ls -1 $DEST_FOLDER_PATH/*$matching_string* | wc -l) -gt 1 ]; then
rm $DEST_FOLDER_PATH/*$matching_string*
fi
fi
#reload remaining files in folder (this optimizes the loop and speeds up the operation
#(this helps lot when folder contains more files))
echo "$(ls $DEST_FOLDER_PATH)" > $TEMP_FILES_LIST_FILE
done < $TEMP_FILES_LIST_FILE
exit 0
, 경로에 스크립트/delete_duplicate_files.sh 같은 파일에
만들기 스크립트 실행) 당신이 원하는대로 이름을 바꿀 수 있습니다
chmod를 + X {경로에 스크립트}
{경로를 삭제해야 /delete_duplicate_files.sh
(일치하는 번호 패턴 파일) 파일을 복제 디렉토리 경로를 제공하여 스크립트를 실행 -script} /delete_duplicate_files.sh "{경로에 디렉토리}"
감사합니다.하지만 이중 입력 및 수동 입력이지만 폴더에는 10KB 이상의 파일이 있어야합니다.파일을 숫자 문자열로 그룹화 한 다음 그룹 수가 1보다 큰 위치를 삭제해야한다고 생각했습니다. – ptminor
정교한 스크립트를 이용해 주셔서 감사합니다. 불행히도 다음과 같은 오류가 발생합니다. {경로 대 스크립트} /delete_duplicate_files.sh : 22 : {경로 대 스크립트} /delete_duplicate_files.sh : [[: 찾을 수 없습니다. – ptminor
path-to-script ->는 스크립트를 보관할 디렉토리 경로입니다. 예를 들어이 스크립트를 홈 폴더에 보관하려면 $ HOME/delete_duplicate_files.sh에 스크립트를 저장하십시오. chmod + x $ HOME/delete_duplicate_files.sh를 입력하십시오. 이 후, path-to-directory -> 파일이 위치한 디렉토리 경로는 $ HOME/images이며, $ HOME/delete_duplicate_files.sh "$ HOME/images"와 같이 스크립트를 실행해야합니다. –
어떤 셸을 사용하고 있습니까? –
/bin/bash를 사용 중입니다. – ptminor
완전히 새로운 답변을 작성했습니다. 이것이 의미하는 바가 맞는지 확인하십시오. –