我在該網站上進行了搜索,沒有發現任何我需要的東西,所以我決定提出自己的問題。
我正在使用 linux,試圖找出一種方法來使用 find、awk、rm 等工具來完成我所描述的操作;但到目前為止我還沒有想出辦法。
一點背景,
- 這些檔案以簡潔的字母順序重命名。沒有空白。
- 子檔案夾也是這樣命名的。
- 當我說最后一個檔案時,我是指按字母排序的最后一個檔案。
- 每個子檔案夾中的檔案數量不一樣。一些子檔案夾有 56 個檔案,而其他子檔案夾甚至沒有達到兩位數。所以我不能像這樣執行一個方便的命令:
rm ./folder-*/020.jpg
如果所有子檔案夾中的檔案數量相同,我將能夠做到這一點。
為了說明目錄,它就像
./original-folder
./original-folder/subfolder-001/001.jpg
./original-folder/subfolder-001/002.jpg
./original-folder/subfolder-001/003.jpg
./original-folder/subfolder-002/001.jpg
./original-folder/subfolder-002/002.jpg
./original-folder/subfolder-003/001.jpg
等等。我希望它基本上看起來像這樣
./original-folder
./original-folder/subfolder-001/001.jpg
./original-folder/subfolder-001/002.jpg
./original-folder/subfolder-002/001.jpg
./original-folder/subfolder-003/001.jpg
請注意,最后一個檔案比以前少一個。
我的解決方案是每次程式進入一個新檔案夾時找到一種方法來啟動一個串列,然后借用該串列的最后一項來執行 rm 命令,但我對如何在 bash 或任何東西中執行此操作一無所知。
感覺就像我需要一種功能齊全的編程語言來做到這一點。
uj5u.com熱心網友回復:
鑒于您的輸入檔案以可排序的方式命名并且不包含任何空格,如您的問題中的示例所示:
$ cat tst.sh
#!/usr/bin/env bash
find ./original-folder -type f |
sort |
awk '
{
dir = $0
sub("/[^/] $","",dir)
}
dir != prev {
prt()
numFiles = 0
prev = dir
}
{ files[ numFiles] = $0 }
END { prt() }
function prt( fileNr, endNr) {
endNr = numFiles - ( numFiles == 1 ? 0 : 1 )
for ( fileNr=1; fileNr <= endNr; fileNr ) {
print files[fileNr]
}
}
' |
xargs -I {} echo rm -- '{}'
$ ./tst.sh
rm -- ./original-folder/subfolder-001/001.jpg
rm -- ./original-folder/subfolder-001/002.jpg
rm -- ./original-folder/subfolder-002/001.jpg
rm -- ./original-folder/subfolder-003/001.jpg
echo一旦您最初測驗并對結果感到滿意,請洗掉。根據輸出結果的任何順序,這sort可能不是必需的,find但它不會受到傷害。
uj5u.com熱心網友回復:
假設您可以在此方法對我有用的目錄上創建檔案:
#!/bin/bash
originalFolder=/path/to/your/directory/containing/orignal-folder
ls $originalFolder > folder_list.txt
while read -r line; do
ls -r $originalFolder/$line > file_list.txt
fileLength=`wc -l < file_list.txt`
if [ $fileLength -gt 1 ]
then
rmFile=`head -n 1 file_list.txt`
rm $originalFolder/$line/$rmFile
fi
done < folder_list.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/429498.html
