簡體   English   中英

移動與其包含的文件名稱相同的文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM