[英]move files that have the same name of the file they contain
一個非常聰明的人(感到諷刺?)已經在自己的目錄中提取了6000多個檔案,但是有時檔案包含一個文件:與該目錄的名稱相同。
例:
mydir(0001)/mydir(0001).txt
mydir(ZREZ)/mydir(ZREZ).txt
mydir(AAEZ)/mydir(AAREZ).txt
mydir(AAEZ)/otherfile.txt
mydir(QQQQ)/mydir(QQQQ).txt
...
有沒有一種快速的方法(Unix shell)來比較文件(如果只有一個文件)和文件所在的目錄,如果文件相同(沒有擴展名),則將其移至上方一個目錄並刪除(現在為空)目錄?
所以我應該得到:
mydir(0001).txt
mydir(ZREZ).txt
mydir(AAEZ)/mydir(AAREZ).txt
mydir(AAEZ)/otherfile.txt
mydir(QQQQ).txt
...
您可以從所有這6000個目錄/文件的父目錄中使用如下腳本:
while IFS= read -d '' -r d; do
n=$(find "$d" -maxdepth 1 -type f -exec echo . \; | wc -l)
f="${d}/${d}.txt"
[[ $n -eq 1 && -f "$f" ]] && mv "$f" "$d/../" && rmdir "$d"
done < <(find . -type d ! -name '.' -print0)
這應該可以解決問題。 比anubhava的腳本簡單一些,但是如果唯一的內容,那就還是只移動文件並刪除目錄。
for x in *; do
if [[ $(find "$x" | sed 1d | head -n2) == "$x/$x.txt" ]]; then
mv "$x/$x.txt" . && rmdir "$x"
fi
done
您可以將其剪切-n-粘貼到父目錄的命令行中。 它循環遍歷該目錄中的所有文件( for x in *
),如果其中任何一個文件本身是僅包含單個文件$x/$x.txt
的目錄,則它將移動文件並刪除目錄。
這是我的腳本,基於Anubhava的第一個答案。 對不起初學者的風格:
#!/bin/bash
# loop & print a folder recusively,
folder_recurse() {
for i in "$1"/*;do
if [ -d "$i" ];then
n=$(find "$i" -maxdepth 1 -exec echo . \; | wc -l)
d=$(readlink -f "${i}")
g=$d"/"$(basename "$i")".epub"
if [[ $n -eq 2 && -f "$g" ]]; then
echo "Doing: $i"
mv "$g" "$d/.."
rmdir "$d"
fi
folder_recurse "$i"
done
}
# try get path from param
path=""
if [ -d "$1" ]; then
path=$1;
else
path="/tmp"
fi
echo "base path: $path"
folder_recurse $path
您可以在父目錄中使用單行代碼來執行此操作:
for i in */*; do [ -f "${i%/*}/${i%/*}.txt" ] && mv "$i" . && rm -d "${i%/*}"; done
由於人們一直對在rm -d
無的BSD上同樣起作用的解決方案感興趣,因此可以使用以下方法實現相同的目的:
for i in */*; do [ -f "${i%/*}/${i%/*}.txt" ] && mv "$i" . && [ -z "$(ls -A "${i%/*}")" ] && rm -r "${i%/*}"; done
然后,在mv
檢查其余目錄是否為空,如果是,則刪除目錄,否則保持目錄不變。
輸出:
drwxr-xr-x 2 david david 4096 Aug 25 16:20 mydir(AAEZ)
-rw-r--r-- 1 david david 0 Aug 25 16:20 mydir(0001).txt
-rw-r--r-- 1 david david 0 Aug 25 16:20 mydir(QQQQ).txt
-rw-r--r-- 1 david david 0 Aug 25 16:20 mydir(ZREZ).txt
mydir\(AAEZ\)/
-rw-r--r-- 1 david david 0 Aug 25 16:20 mydir(AAREZ).txt
-rw-r--r-- 1 david david 0 Aug 25 16:20 otherfile.txt
如果需要,您還可以在移動文件后(刪除目錄之前)測試目錄是否為空。 所示
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.