How can I read all the files with a similar pattern in a folder and pass them as a comma separated string to...
I have this bash file:
#!/bin/bash
some_code.py -i 1_xxx.txt,2_xxx.txt,...,10_xxx.txt -o something.txt
The list "1_xxx.txt,2_xxx.txt,...,10_xxx.txt"
contains the names of the files in the folder that have xxx
in common.
The input to some_code.py
must come after -i
in the form of the file names separated by comma with no spacing.
My question is: how can I echo the filenames (with xxx
) into a comma separated string and pass it to my Python code?
bash echo
add a comment |
I have this bash file:
#!/bin/bash
some_code.py -i 1_xxx.txt,2_xxx.txt,...,10_xxx.txt -o something.txt
The list "1_xxx.txt,2_xxx.txt,...,10_xxx.txt"
contains the names of the files in the folder that have xxx
in common.
The input to some_code.py
must come after -i
in the form of the file names separated by comma with no spacing.
My question is: how can I echo the filenames (with xxx
) into a comma separated string and pass it to my Python code?
bash echo
add a comment |
I have this bash file:
#!/bin/bash
some_code.py -i 1_xxx.txt,2_xxx.txt,...,10_xxx.txt -o something.txt
The list "1_xxx.txt,2_xxx.txt,...,10_xxx.txt"
contains the names of the files in the folder that have xxx
in common.
The input to some_code.py
must come after -i
in the form of the file names separated by comma with no spacing.
My question is: how can I echo the filenames (with xxx
) into a comma separated string and pass it to my Python code?
bash echo
I have this bash file:
#!/bin/bash
some_code.py -i 1_xxx.txt,2_xxx.txt,...,10_xxx.txt -o something.txt
The list "1_xxx.txt,2_xxx.txt,...,10_xxx.txt"
contains the names of the files in the folder that have xxx
in common.
The input to some_code.py
must come after -i
in the form of the file names separated by comma with no spacing.
My question is: how can I echo the filenames (with xxx
) into a comma separated string and pass it to my Python code?
bash echo
bash echo
edited Nov 20 '18 at 19:22
Theoden
asked Nov 20 '18 at 18:41
TheodenTheoden
529
529
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
You could use command substitution and set IFS
to ,
. Assume you have
$ ls
1098_xxx.txt 20260_xxx.txt 22286_xxx.txt 32025_xxx.txt 6433_xxx.txt
then you can do1
echo "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")"
resulting in
1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt
or, for your use case:
some_code.py -i "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")" -o something.txt
$(...)
is command substitution, and ${f[*]}
is a parameter expansion that uses the first character from IFS
as the element separator.
This should be save for file names containing any character, including spaces and glob characters; if you have hidden files (starting with .
), they'll be ignored, unless you set the shopt -s dotglob
shell option.
Also, if you potentially have no files matching *xxx*
, you could set shopt -s nullglob
to prevent creating a file that's literally called *xxx*
.
1echo "$(cmd)"
is usually an anti-pattern to be replaced by just cmd
; I'm using it here with echo
as a placeholder for other commands. Using command substitution also has the benefit of changing IFS
only there and not in the parent shell.
Thanks. It does exactly what I need.
– Theoden
Nov 20 '18 at 19:07
@Amessihel Good point, actually - that could be messed up when filenames start with-
. Should useprintf
!
– Benjamin W.
Nov 20 '18 at 19:34
add a comment |
If you insist on the exact format, you can do it with with bash loops:
f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done
This will generate string:
1_xxx.txt,2_xxx.txt,...,10_xxx.txt,
Now if you want to remove the last ,
use sed s'/.$//'
, pipe it like this:
f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done | sed s'/.$//'
This will generate the string that you're after. You can then wrap a ()
around it for use within your bash command.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53399481%2fhow-can-i-read-all-the-files-with-a-similar-pattern-in-a-folder-and-pass-them-as%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
You could use command substitution and set IFS
to ,
. Assume you have
$ ls
1098_xxx.txt 20260_xxx.txt 22286_xxx.txt 32025_xxx.txt 6433_xxx.txt
then you can do1
echo "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")"
resulting in
1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt
or, for your use case:
some_code.py -i "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")" -o something.txt
$(...)
is command substitution, and ${f[*]}
is a parameter expansion that uses the first character from IFS
as the element separator.
This should be save for file names containing any character, including spaces and glob characters; if you have hidden files (starting with .
), they'll be ignored, unless you set the shopt -s dotglob
shell option.
Also, if you potentially have no files matching *xxx*
, you could set shopt -s nullglob
to prevent creating a file that's literally called *xxx*
.
1echo "$(cmd)"
is usually an anti-pattern to be replaced by just cmd
; I'm using it here with echo
as a placeholder for other commands. Using command substitution also has the benefit of changing IFS
only there and not in the parent shell.
Thanks. It does exactly what I need.
– Theoden
Nov 20 '18 at 19:07
@Amessihel Good point, actually - that could be messed up when filenames start with-
. Should useprintf
!
– Benjamin W.
Nov 20 '18 at 19:34
add a comment |
You could use command substitution and set IFS
to ,
. Assume you have
$ ls
1098_xxx.txt 20260_xxx.txt 22286_xxx.txt 32025_xxx.txt 6433_xxx.txt
then you can do1
echo "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")"
resulting in
1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt
or, for your use case:
some_code.py -i "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")" -o something.txt
$(...)
is command substitution, and ${f[*]}
is a parameter expansion that uses the first character from IFS
as the element separator.
This should be save for file names containing any character, including spaces and glob characters; if you have hidden files (starting with .
), they'll be ignored, unless you set the shopt -s dotglob
shell option.
Also, if you potentially have no files matching *xxx*
, you could set shopt -s nullglob
to prevent creating a file that's literally called *xxx*
.
1echo "$(cmd)"
is usually an anti-pattern to be replaced by just cmd
; I'm using it here with echo
as a placeholder for other commands. Using command substitution also has the benefit of changing IFS
only there and not in the parent shell.
Thanks. It does exactly what I need.
– Theoden
Nov 20 '18 at 19:07
@Amessihel Good point, actually - that could be messed up when filenames start with-
. Should useprintf
!
– Benjamin W.
Nov 20 '18 at 19:34
add a comment |
You could use command substitution and set IFS
to ,
. Assume you have
$ ls
1098_xxx.txt 20260_xxx.txt 22286_xxx.txt 32025_xxx.txt 6433_xxx.txt
then you can do1
echo "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")"
resulting in
1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt
or, for your use case:
some_code.py -i "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")" -o something.txt
$(...)
is command substitution, and ${f[*]}
is a parameter expansion that uses the first character from IFS
as the element separator.
This should be save for file names containing any character, including spaces and glob characters; if you have hidden files (starting with .
), they'll be ignored, unless you set the shopt -s dotglob
shell option.
Also, if you potentially have no files matching *xxx*
, you could set shopt -s nullglob
to prevent creating a file that's literally called *xxx*
.
1echo "$(cmd)"
is usually an anti-pattern to be replaced by just cmd
; I'm using it here with echo
as a placeholder for other commands. Using command substitution also has the benefit of changing IFS
only there and not in the parent shell.
You could use command substitution and set IFS
to ,
. Assume you have
$ ls
1098_xxx.txt 20260_xxx.txt 22286_xxx.txt 32025_xxx.txt 6433_xxx.txt
then you can do1
echo "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")"
resulting in
1098_xxx.txt,20260_xxx.txt,22286_xxx.txt,32025_xxx.txt,6433_xxx.txt
or, for your use case:
some_code.py -i "$(IFS=,; f=(*xxx*); printf '%sn' "${f[*]}")" -o something.txt
$(...)
is command substitution, and ${f[*]}
is a parameter expansion that uses the first character from IFS
as the element separator.
This should be save for file names containing any character, including spaces and glob characters; if you have hidden files (starting with .
), they'll be ignored, unless you set the shopt -s dotglob
shell option.
Also, if you potentially have no files matching *xxx*
, you could set shopt -s nullglob
to prevent creating a file that's literally called *xxx*
.
1echo "$(cmd)"
is usually an anti-pattern to be replaced by just cmd
; I'm using it here with echo
as a placeholder for other commands. Using command substitution also has the benefit of changing IFS
only there and not in the parent shell.
edited Nov 20 '18 at 19:35
answered Nov 20 '18 at 18:59


Benjamin W.Benjamin W.
20.6k134856
20.6k134856
Thanks. It does exactly what I need.
– Theoden
Nov 20 '18 at 19:07
@Amessihel Good point, actually - that could be messed up when filenames start with-
. Should useprintf
!
– Benjamin W.
Nov 20 '18 at 19:34
add a comment |
Thanks. It does exactly what I need.
– Theoden
Nov 20 '18 at 19:07
@Amessihel Good point, actually - that could be messed up when filenames start with-
. Should useprintf
!
– Benjamin W.
Nov 20 '18 at 19:34
Thanks. It does exactly what I need.
– Theoden
Nov 20 '18 at 19:07
Thanks. It does exactly what I need.
– Theoden
Nov 20 '18 at 19:07
@Amessihel Good point, actually - that could be messed up when filenames start with
-
. Should use printf
!– Benjamin W.
Nov 20 '18 at 19:34
@Amessihel Good point, actually - that could be messed up when filenames start with
-
. Should use printf
!– Benjamin W.
Nov 20 '18 at 19:34
add a comment |
If you insist on the exact format, you can do it with with bash loops:
f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done
This will generate string:
1_xxx.txt,2_xxx.txt,...,10_xxx.txt,
Now if you want to remove the last ,
use sed s'/.$//'
, pipe it like this:
f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done | sed s'/.$//'
This will generate the string that you're after. You can then wrap a ()
around it for use within your bash command.
add a comment |
If you insist on the exact format, you can do it with with bash loops:
f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done
This will generate string:
1_xxx.txt,2_xxx.txt,...,10_xxx.txt,
Now if you want to remove the last ,
use sed s'/.$//'
, pipe it like this:
f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done | sed s'/.$//'
This will generate the string that you're after. You can then wrap a ()
around it for use within your bash command.
add a comment |
If you insist on the exact format, you can do it with with bash loops:
f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done
This will generate string:
1_xxx.txt,2_xxx.txt,...,10_xxx.txt,
Now if you want to remove the last ,
use sed s'/.$//'
, pipe it like this:
f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done | sed s'/.$//'
This will generate the string that you're after. You can then wrap a ()
around it for use within your bash command.
If you insist on the exact format, you can do it with with bash loops:
f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done
This will generate string:
1_xxx.txt,2_xxx.txt,...,10_xxx.txt,
Now if you want to remove the last ,
use sed s'/.$//'
, pipe it like this:
f=(*_xxx.txt); for w in ${f[@]}; do echo -n "$w,"; done | sed s'/.$//'
This will generate the string that you're after. You can then wrap a ()
around it for use within your bash command.
answered Nov 20 '18 at 18:51
Rocky LiRocky Li
2,8731316
2,8731316
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53399481%2fhow-can-i-read-all-the-files-with-a-similar-pattern-in-a-folder-and-pass-them-as%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown