巴什环 - 在一个目录中创建为每个现有的txt文件的文件夹(Bash loop - creating

2019-10-21 03:57发布

我有一个目录下的文本文件,我想组织。 我试图通过为每个文件的目录这样做通庆典。 当我将文件移动到各自新的文件夹,我要修改原来的filename ,并创建一个额外的文本文件labeld info.txt保存原文件名(该文件也将在新文件夹)。 该文件名称的改变,从去xxx-file_name-aa1.txtxxx-aa1.txt 。 第一个和最后一个之间的任何东西-被剥离出来。 该文件夹具有相同的名称文件xxx-aa1

test.sh(我的sed声明条whitspaces并把一切都以较低的情况下,除了在最后什么-

FILE_PATH="/media/sf_linux_sandbox/txt_files/"
while read -r file; do
#sed statement empty
new_name=$(echo "$file" | sed 's/^\(.*\)\(-[^-]*\)$/\L\1\E\2/; s/ *- */-/; s/^\(.*\) \+- *\([^-]*\)$/\1-\2/; s/ /_/g')
mv "$file" "$new_name"
done < <(find $FILE_PATH -maxdepth 1 -type f -name '*.txt')

输入:

|-- ./
|   |-- xxxx-test_file1-aa1.txt
|   |-- xxxx-test_file2-bb2.txt

所需的输出:

|-- ./
|   |-- xxxx-aa1
|       |--xxx-aa1.txt
|       |--info.txt // contains name 'test_file1'
|   |-- xxxx-bb2
        |--xxx-bb2.txt
        |--info.txt // contains name 'test_file2'

电流输出

|-- ./
|   |-- xxxx-test_file-aa1
|       |--xxxx-test_file-aa1.txt
|   |-- xxxx-test_file-bb2
        |--xxxx-test_file-bb2.txt

Answer 1:

实际上,你可以做的Bash本身所有这些操作。

既然你有-maxdepth 1 ,它看起来像你可以使用通配符代替循环的find ,所以我重构这一点。

FILE_PATH="/media/sf_linux_sandbox/videos/"
for file in "$FILE_PATH"/*.mp4; do
    tmp=${file#*-}; head=${file%-"$tmp"}
    mid=${tmp%-*}; tail=${tmp#"$mid"-}
    base="${head,,}-${tail,,}"
    dir=${base%.mp4}
    mkdir -p "$dir"
    mv "$file" "$dir/$base"
    echo "$mid" >"$dir"/info.txt
done

简言之, ${var#prefix}扩展到的值varprefix移除, ${var%suffix}相应执行与后缀相同的替换。 最后, ${var,,}产生价值的小写版本。 然后,我们简单地组装您从这些零件所需的文件名结构。



Answer 2:

改变sed

new_name=$(echo "$file" | sed -r 's/-[^-]*-/-/g')

例如:

$ echo xxxx-test_file-aa1.txt | sed -r 's/-[^-]*-/-/g'
xxxx-aa1.txt

-[^-]*-选择两者之间的串- ,sed的s代之以-

你也可以使用grep命令来获取目录的名称

$ echo $new_name | grep -o '^[^.]*'
xxxx-aa1

^[^.]*选择部中的文件名,这并不包含. 这是ommits扩展。

编辑

要获取文件名

$ echo "xxx-test_file-aa1.txt" | grep -oP '(?<=-)[^.]*(?=-)'
test_file

(?<=-)向后断言检查,如果图案是由preseced -

(?=-)如果该图案之后是前向断言的检查-

[^.]*模式匹配比其他任何东西. ,选择的文件名



文章来源: Bash loop - creating a folder for each existing txt file in a directory