僅在 Linux 下移動文件

僅在 Linux 下移動文件

我有一個路徑 /participant/data,其中所有檔案都位於資料目錄中。但是,我希望目錄結構為 /participant/data/subdirectory,其中子目錄包含所有檔案。它需要像這樣才能通過管道。

我的第一個想法是

mkdir /參與者/資料/子目錄/

mv /參與者/資料/*.* /參與者/資料/子目錄/

但是,這些檔案沒有檔案副檔名,因此使用 *.* 不起作用。關於如何執行此操作有什麼建議嗎?

答案1

只需移動所有內容:

mv /participant/data/* /participant/data/subdirectory/

這會抱怨無法移動subdirectory到自身,但仍會以您想要的方式將其他所有內容移至該子目錄中。

Bashshopt -s extglob添加了一些額外的通配符,例如!(xy|z)匹配所有內容,例如* 除了 xy或者z

shopt -s extglob
mv /participant/data/!(subdir) /participant/data/subdir/

(Zsh 可能有更多擴充通配符,只能匹配檔案。)

如果您有更多子目錄並且不想觸及它們,findfd可以使用 或 等工具僅對特定項目進行操作,在本例中僅對文件進行操作:

find /participant/data -maxdepth 1 -type f -exec mv {} /participant/data/subdir/ \;

mv -t使用and會稍微更有效-exec +

find /participant/data -maxdepth 1 -type f -exec mv -t /participant/data/subdir {} +

前面的(較慢的)範例也可以寫成 shellfor循環:

for x in /participant/data/*; do
    if [[ -f $x ]]; then mv "$x" /participant/data/subdirectory/; fi
done

答案2

您可以使用*而不是*.*包含與檔案名稱無關的所有檔案。

但這也包括目錄,也包括subdirectory,因此在移動文件時必須排除它。

這可以透過擴展模式匹配功能來實現。首先,您必須啟用它們(對於當前會話):

$ shopt -s extglob

然後您可以使用以下命令來處理除一個文件之外的所有文件path/!(excludedFile)

實施於mv

$ mv /participant/data/!(subdirectory) /participant/data/subdirectory/

還有更多選項可以移動除一個文件之外的所有文件:https://www.baeldung.com/linux/move-all-files- except-one

答案3

對於您所描述的情況,最簡單的方法是:

cd /participant/data
mkdir .tempname
mv * .tmpname
mv .tmpname subdirectory

* 將符合所有未隱藏的目錄條目,即所有不以點開頭的目錄條目。由於我們暫時以點開頭子目錄名稱,因此它不匹配,並且資料中的所有條目都將被移動。現在,如果您有一些不想移動的條目(例如其他子目錄),則必須使用更複雜的方法,例如 user1686 的詳細答案中的方法。

相關內容