簡體   English   中英

移動文件並在Bash上包含它的目錄之后重命名它

[英]Moving a file and renaming it after the directory which contains it on Bash

我正在嘗試在Linux上學習bash,只是為了好玩。 我認為有一個將類似文件組合在一起的.sh會非常有用。 例如,假設我們有目錄

/主頁/文檔/

在目錄中我們有/ mathdocs /,/ codingdocs /等。

在這些子目錄中,我們都有doc.txt。 子目錄上所有文件的名稱相同。

假設我想將它們組合在一起,我想將所有文件移動到/ home / allthedocs /並在它們所在的目錄之后重命名它們。(mathdocs.txt,codingdocs.txt等)

我怎么能這樣做?

我試圖創建一個基於ls和cp命令的腳本,但我不知道如何在移動它們之后將目錄名稱重命名為其中的文件。 我想它必須是某種迭代句子(對於Y目錄上的X)但我不知道該怎么做。

您可以使用mv一次性移動和重命名文件,並使用循環通過glob抓取所有文件:

#!/bin/bash

dest_dir=/home/allthedocs

cd /home/docs
for file in */doc.txt; do
  [[ -f "$file" ]] || continue # skip if not a regular file
  dir="${file%/*}"             # get the dir name from path
  mv "$file" "$dest_dir/$dir.txt"
done

有關更多信息,請參閱此帖子:

這是一個單線程解決方案,用於處理文件名中的空格,就像@codeforester的解決方案對glob一樣。

請注意,使用傳遞給“find”的“-print0”選項,while循環中的內部字段分隔符(IFS)以及帶引號的file3變量包裝來處理空格。

從file2到file3的參數替換擺脫了前導“./”。

move命令中的參數substition將路徑轉換為文件名(在/ home / docs /下運行):

find . -maxdepth 2 -mindepth 2 -print0 | while IFS= read -r -d '' file; \
do file2=$(printf '%s\n' "$file"); file3=${file2#*\/*}; \
mv "$file2" ../allsil/"${file3//\//}"; done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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