[英]move all the folders and files to the folder with the same subject name in the directory Linux
[英]How to change all folders and files permessions base on folder name?
例如,我們有以權限編號 555 或 700 或 777 命名的文件夾......我們如何獲取文件名並根據文件夾名稱更改所有具有權限的子文件夾和文件? 所以如果我們將它應用到文件夾 555 上,當前文件夾和里面的所有內容都將獲得 555 的權限,我試過了
find . -name "[0-9][0-9][0-9]" -type d | xargs chmod -Rv [0-9][0-9][0-9]
但它只需要第一個文件夾名稱並將其應用於我希望它單獨處理每個文件夾名稱(命名為withe許可)的所有內容謝謝。
我試過找到。 -名稱“[0-9][0-9][0-9]”-類型 d | xargs chmod -Rv [0-9][0-9][0-9] 但它只采用第一個文件夾名稱並將其應用於我希望它單獨處理每個文件夾名稱(命名為權限)的所有內容
您的嘗試在幾個方面是錯誤的,其中包括:
[0-9][0-9][0-9]
模式匹配包含非八進制數字字符的名稱。
[0-9][0-9][0-9]
模式在解析命令時將被 shell 擴展。 如果擴展成功,則第一個匹配的名稱將給出要應用的模式。 如果擴展不成功,那么(默認情況下)模式本身將傳遞給chmod
,它將拒絕它作為無效模式。
默認情況下, xargs
命令將接受盡可能多的輸入,以將 arguments 形成為一個命令。 因此,在您的示例命令中,如果find
標識文件夾700
、 555
、 755
和400
那么xargs
將最終執行如下操作:
chmod -Rv <... expansion of [0-9][0-9][0-9]...> 700 555 755 400
即使模式擴展為空(這可能在稍微不同的情況下發生),您也會得到與以前類似的結果:第一個目錄名將提供模式,所有其他目錄名將更新為該模式。
這種變化應該做你想做的:
find . -name "[0-7][0-7][0-7]" -type d |
sed 's,^.*/\([^/]*\)$,\1\n\0,' |
xargs -r -l2 chmod -Rv
sed
命令獲取find
發出的每個路徑,提取基本名稱,並將其放在單獨的前一行中。 例如,如果其中一行find
發出的是
./subdir/755
然后 sed 將其更改為
755
./subdir/755
. 即,要應用的模式和應用它的目錄。
然后xargs
的-l2
選項告訴它在形成每個chmod
命令時使用(最多)兩個輸入行,所以你最終會得到一系列形式的命令
chmod -Rv 755 ./subdir/755
xargs
的-r
選項很巧妙,告訴它如果沒有從標准輸入中讀取任何行,則完全避免執行任何命令。
sed
表達式 [注意:我稍微簡化了此答案原始版本中給出的sed
命令。]
sed
命令...
sed 's,^.*/\([^/]*\)$,\1\n\0,'
... 根據給定的表達式處理每個輸入行,這是一個帶有逗號 ( ,
) 分隔符s
替換命令。
^\(.*/\)\([^/]*\)$
。 這匹配
^
),.*
,/
) 字符,[^/]*
) 以外的任意數量的任何字符$
)。\1
)的內容,然后是\n
),然后是\0
),這將是原始行,因為匹配被錨定到行的開頭和結尾。 sed
會將每個輸入行與目標模式進行匹配。 任何包含至少一個斜杠的行都將匹配,並且給定find
命令發出的每一行都將滿足該條件。 整個匹配項(將是整行)將由給定的替換項替換,由兩行組成——一行包含最后一個斜杠后面的原始行的尾部,另一行包含整個原始行。
不確定是否理解問題。
需要示例輸入和示例output才能理解。
dir_name="555"; chmod -R "$dir_name" $(find . -path "*$dir_name*")
dir_name="555";
: 分配一個變量dir_name
保存目錄名555
和chmod
權限值555
$(find. -path "*$dir_name*")
:列出當前目錄下的所有文件,其路徑中某處有555
個文件。
chmod -R "$dir_name"
: Chmod 命令使用dir_name
555
的值
我會用這樣的東西。
find . -type d -name '???' -printf '%f\n' | xargs -I'{}' chmod -R '{}' '{}'
-type d
-- 只查找目錄。-name???
-- 這將覆蓋名為 555、700、777 等的目錄printf '%f\n'
-- 只打印目錄名。 為了真正安全,我會添加另一個選項( -maxdepth
):
find . -maxdepth 1 -type d -name '???' -printf '%f\n' | xargs -I'{}' chmod -R '{}' '{}'
maxdepth 1
-- 不要對子文件夾進行任何搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.